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