WakefulIntentService разъяснения реализации
CommonsWare-хWakefulIntentService работает красиво, но есть некоторые вещи, которые я не совсем понимаю. Ниже приводится ядро, сервис - урезанная версияисточник :
class WIS extends IntentService {
private static final String NAME = WIS.class.getName() + ".Lock";
private static volatile WakeLock lockStatic = null;
synchronized private static PowerManager.WakeLock getLock(Context context) {
if (lockStatic == null) {
PowerManager mgr = (PowerManager) context
.getSystemService(Context.POWER_SERVICE);
lockStatic = mgr.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, NAME);
lockStatic.setReferenceCounted(true);
}
return (lockStatic);
}
public static void startWIS(Context ctxt, Intent i) {
getLock(ctxt.getApplicationContext()).acquire();
ctxt.startService(i);
}
public WIS(String name) {
super(name);
setIntentRedelivery(true);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
PowerManager.WakeLock lock = getLock(this.getApplicationContext());
if (!lock.isHeld() || (flags & START_FLAG_REDELIVERY) != 0) { // ?
lock.acquire();
}
super.onStartCommand(intent, flags, startId);
return (START_REDELIVER_INTENT);
}
@Override
protected void onHandleIntent(Intent intent) {
try {
// do your thing
} finally {
PowerManager.WakeLock lock = getLock(this.getApplicationContext());
if (lock.isHeld()) lock.release();
}
}
}
Вопросов
Что произойдет, если процесс будет убит сразу послеonReceive()
нашего приемника тревоги возвращается? Это если сервисonCreate()
(если служба еще не создана) илиonStartCommand()
никогда не беги. AFAIK убитый процесс берет свои замки с ним. Или это невозможный сценарий?С учетом предыдущего следует(flags & START_FLAG_RETRY)
быть добавленным?Почемуif (!lock.isHeld())
проверить ?Почемуthis.getApplicationContext()
нужен? не являетсяthis
довольно ?