2011-05-30 2 views
2

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

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

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

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

ответ

5

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

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

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

+3

«Я думаю, что у Марка или у кого-то может быть вспомогательный код для этого». Это может означать мой «WakefulIntentService» : https://github.com/commonsguy/cwac-wakeful – CommonsWare