@AnanthRajSingh ДА, если принудительная остановка приложения по какой-либо причине прекращает работу приемника вещания, я не нашел никакого решения для преодоления этой проблемы. Сейчас вы / пользователь должны перезапустить приложение снова.

я есть Android-приложение с виджетом часов, которое я сейчас пытаюсь обновить до требований API 26.

До сих пор я использовал фоновый сервис, который регистрируется при запуске в егоonCreate метод аBroadcastReceiver получать системные трансляции, такие какandroid.intent.action.SCREEN_ON, android.intent.action.SCREEN_OFF, android.intent.action.TIME_SET, android.intent.action.TIMEZONE_CHANGED, Затем эта служба приостанавливала часы, когда экран выключен, и включала их, когда экран снова включался, чтобы сохранить заряд батареи.

В Oreo сервис такого рода не представляется возможным, поскольку он должен работать на переднем плане с уведомлением, которое действительно не имеет значения для пользователя. Кроме того, насколько я видел в документации,JobScheduler не может помочь мне, так как я не нашел, что можно запланировать работу, когда экран включен.

Я пытался создатьBroadcastReceiver в пределахAppWidgetProvider класс, и зарегистрировать его вAppWidgetProvider«sonUpdate способ получения указанной системы трансляций. Это работает хорошо, и трансляции принимаются, но только до тех пор, пока экран не отключится на некоторое время; после этого кажется, что приложение каким-то образом убивается системой или перестает работать без каких-либо сообщений об ошибках или сбоях; однако, все равно, если я нажму на него, он откроет активность конфигурации как обычно.

Мои вопросы:

Как правильно прослушивать трансляции включения / выключения экрана в API 26+, если я не хочу запускать службу переднего плана?

Можно ли прослушивать системные трансляции сAppWidgetProvider сам класс, зарегистрировавBroadcastReceiver в нем или даже путем регистрацииAppWidgetProvider сам получать системные события (во всяком случаеAppWidgetProvider является продолжениемBroadcastReceiver).

Почему мойAppWidgetProvider по-видимому, прекратить получать намерения системы вещания после некоторого периода сна?

РЕДАКТИРОВАТЬ:

Я нашел следующее в документации Android дляregisterReceiver метод, который, кажется, является ответом на мои вопросы 2 и 3.

Примечание: этот метод не может быть вызван из компонента BroadcastReceiver; то есть от BroadcastReceiver, который объявлен в манифесте приложения. Однако можно вызывать этот метод из другого BroadcastReceiver, который сам был зарегистрирован во время выполнения с помощью registerReceiver (BroadcastReceiver, IntentFilter), поскольку время жизни такого зарегистрированного BroadcastReceiver связано с объектом, который его зарегистрировал.

Я бы пришел к выводу, что мое использование и регистрацияBroadcastReceiver внутриAppWidgetProvider противоречил этой спецификации.

Я оставлю этот пост открытым, потому что другие могут посчитать эту информацию полезной, и мой вопрос 1 все еще остается в силе.

Ответы на вопрос(1)

Ваш ответ на вопрос