Нужно ли получать WakeLock, если я не создаю темы? - PullRequest
2 голосов
/ 30 мая 2011

Я создаю Service, который будет настроен для начала использования AlarmManager (используя ELAPSED_REALTIME_WAKEUP). Я делаю всю свою обработку внутри метода onStartCommand главным образом потому, что:

  1. Это не займет много времени (чтение небольшого файла с диска, может быть push-уведомлений через NotificationManager)
  2. Я могу легко настроить его на запуск в отдельном процессе, если мне нужно.

При этих обстоятельствах мне все еще нужно получить WakeLock?

Из того, что я знаю, вы должны получить WakeLock, только если вы создаете отдельные потоки (потому что ОС увидит основной поток как бездействующий и перейдет в спящий режим). Это правда или я все еще рискую быть прерванным ОС ... задремать?

1 Ответ

5 голосов
/ 30 мая 2011

Остерегайтесь - в настоящее время вы не должны получать оповещения о пробуждении, доставленные непосредственно в службу. Доставка к услуге отличается от доставки до получателя; диспетчер аварийных сигналов не может знать, когда завершается выполнение службы, поэтому он не может убедиться, что он удерживает для вас активную блокировку даже до вызова вашего onStartCommand ().

Таким образом, для этого вам понадобится приемник, на который отправляется сигнал тревоги, в этом приемнике устанавливается блокировка пробуждения, а затем вызывается startService (), чтобы служба выполнялась и гарантировала, что вы не отпустите блокировка до тех пор, пока обслуживание не будет выполнено. Да, извините, это отстой. :( Я думаю, что Марк или кто-то может иметь вспомогательный код для этого.

Один из способов упростить это, если вы заботитесь только о том, что происходит, когда служба уже запущена. Context.peekService () может использоваться в onReceiveIntent () для получения работающей в данный момент службы, и вы можете вызвать ее прямо в приемнике, чтобы критический код выполнялся, пока вы удерживаете активную блокировку. Кроме того, если вы используете общий случай, когда они выполняются в одном и том же процессе, вы можете использовать те же приемы, что и в документе Service, чтобы напрямую вызывать его без необходимости писать файл aidl.

...