Commonsware's WakefulIntentService работает красиво, но есть некоторые вещи, которые я не совсем понимаю. Ниже основной службы - урезанная версия source:Замечания по реализации 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
?
«Если у вас есть доказательства обратного, я бы с удовольствием это увидел». - не бит, просто документы не ясно, что когда START_FLAG_RETRY установлен, START_FLAG_REDELIVERY также установлен –
A-important - если сценарий, который я описываю, происходит, а onCreate (или даже Constructor, где мы 'setRedeliverIntent (true)'), не бежать - мы теряем? Или система будет запускать 'onStartCommand' с START_FLAG_RETRY? –
@Mr_and_Mrs_D: «Документы не ясно, что когда START_FLAG_RETRY установлен, START_FLAG_REDELIVERY также установлен» - «START_FLAG_REDELIVERY» устанавливается, когда используется «START_REDELIVER_INTENT», и я не знаю случая, когда я когда-либо видел «START_FLAG_RETRY 'самостоятельно. «нужна ли инициализация ссылочных полей нулевому?» - Нет, это стиль личного кодирования. «если сценарий, который я описываю, произойдет» - я понятия не имею, что произойдет в этом случае, извините. – CommonsWare