@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 все еще остается в силе.