Нужно ли мне получать wakelock, если я не использую широковещательный приемник для обработки IntentServices, отправленных из Alarm Manager?

Я читал о запуске службы из BroadcastReceiver. В этом сценарии я должен получить WakeLock, пока намерение не будет обработано IntentService.

А как насчет вызова IntentService непосредственно из AlarmManager, заключенного в pendingIntent? В этом сценарии нет BroadcastReceiver... намерение перенаправляется непосредственно в onHandleIntent службы. Тогда, где я могу получить замок? Он действительно нужен??? Кажется, все работает нормально.


person Héctor Júdez Sapena    schedule 23.08.2012    source источник
comment
Что произойдет, если устройство перейдет в спящий режим, пока вы обрабатываете намерение. Если ничего страшного не случится, то замок вам не нужен.   -  person jsmith    schedule 23.08.2012
comment
Вы имеете в виду, пока выполняется метод onHandleIntent? Итак, если я получаю блокировку в начале onHandleIntent и освобождаю ее в конце, правильно ли я поступаю?   -  person Héctor Júdez Sapena    schedule 23.08.2012
comment
Да, это должно предотвратить прерывание.   -  person jsmith    schedule 23.08.2012
comment
похоже, основываясь на этом комментарии от @CommonsWare, я вынужден использовать BroadcastReceiver посередине общение"> stackoverflow.com/questions/4982920/   -  person Héctor Júdez Sapena    schedule 23.08.2012
comment
Я должен был бы посмотреть на его класс, но я полагаю, что это самый безопасный способ. Затем он обрабатывает намерение, которое ставится в очередь и обрабатывается. Таким образом, вы не пропустите событие и не будете прерваны во время его обработки.   -  person jsmith    schedule 23.08.2012
comment
@HéctorJúdezSapena Вы должны получить доступ к ответу, так как он правильный. В противном случае, пожалуйста, опишите, почему вы не принимаете его.   -  person redochka    schedule 06.09.2015


Ответы (1)


IntentService — это только многопоточная служба. Вам нужно будет приобрести блокировку пробуждения. У Commonsguy есть прекрасный WakefulIntentService здесь.

Его IntentService получает Wakelock для вас, поэтому, если вы вызовете его из AlarmService, он проснется, получит пробуждение и отпустит его, когда работа будет выполнена.

Я использовал его много раз, он отлично работает, а исходный код находится на Github, так что вы можете увидеть, как он работает.

person Chris.Jenkins    schedule 23.08.2012
comment
Я видел реализацию Commonsguy, но в моем шаблоне нет BroadcastReceiver. Насколько я понимаю, блокировка необходима, потому что после завершения метода onReceive широковещательного приемника есть вероятность, что служба может не запуститься, если телефон спит. Однако я вообще не использую какой-либо широковещательный приемник... AlarmManager имеет свою собственную блокировку, и именно AlarmManager запускает IntentService, а не широковещательный приемник. - person Héctor Júdez Sapena; 23.08.2012
comment
Да, но менеджер аварийных сигналов снимет блокировку ITS, как только отправит ваше намерение, и телефон может отключиться, пока намерение обрабатывается. - person Philippe Girolami; 23.08.2012
comment
хорошо, спасибо, основываясь на ваших комментариях и stackoverflow.com/questions/4982920/ Я реализую шаблон Alarm-›Receiver-›Service, используя систему блокировки. - person Héctor Júdez Sapena; 23.08.2012
comment
Я предполагаю, что то же самое нужно сделать, если использовать классические сервисы вместо IntentServices, я прав? - person Héctor Júdez Sapena; 27.08.2012
comment
@HéctorJúdezSapena правильно, IntentService расширяет Service, так как блокировка пробуждения вам нужна, когда вы хотите, чтобы ваше приложение работало, когда устройство находится в спящем режиме. - person Chris.Jenkins; 29.08.2012
comment
Это правильный ответ. спасибо @Chris.Jenkins за WakefulIntentService - person redochka; 06.09.2015