У меня есть приложение 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
не может помочь мне, поскольку я не нашел, что можно запланировать задание, когда экран JobScheduler
.
Я попытался создать BroadcastReceiver
в классе AppWidgetProvider
и зарегистрировать его в AppWidgetProvider
onUpdate
для получения указанных системных передач. Это хорошо работает, и трансляции действительно получают, но только до тех пор, пока экран не погаснет в течение определенного периода времени; после этого кажется, что приложение каким-то образом убивается системой или иным образом перестает работать без какой-либо сообщенной ошибки или сбоя; однако, если я нажму на него, он откроет активность конфигурации как обычно.
Мои вопросы:
-
Как правильно прослушивать трансляцию по экрану в API 26+, если я не хочу запускать службу переднего плана?
-
Возможно ли прослушивание системных передач из самого класса
AppWidgetProvider
, путем регистрации в немBroadcastReceiver
или даже регистрации самогоAppWidgetProvider
для получения системных событий (в любом случаеAppWidgetProvider
является расширениемBroadcastReceiver
). -
Почему мой
AppWidgetProvider
видимому прекращает получать транслируемые системные намерения после некоторого периода сна?
РЕДАКТИРОВАТЬ:
В документации Android для метода registerReceiver
я нашел следующее: это ответ на мои вопросы 2 и 3.
Примечание: этот метод нельзя вызвать из компонента BroadcastReceiver; то есть от BroadcastReceiver, объявленного в манифесте приложения. Однако можно назвать этот метод другим BroadcastReceiver, который сам был зарегистрирован во время выполнения с помощью registerReceiver (BroadcastReceiver, IntentFilter), так как время жизни такого зарегистрированного BroadcastReceiver привязано к объекту, который его зарегистрировал.
Я бы сделал вывод, что мое использование и регистрация BroadcastReceiver
внутри AppWidgetProvider
противоречили этой спецификации.
Я оставлю это сообщение открытым, потому что другие могут найти эту информацию полезной, и мой вопрос 1 все еще остается в силе.