Современный метод для постоянно обновляемых уведомлений («виджет уведомлений») - PullRequest
0 голосов
/ 09 декабря 2018

Я изо всех сил пытаюсь найти текущий современный метод для уведомлений, которые часто обновляются (например, каждые 3 минуты).Кажется, что в новые версии Android встроено так много настроек энергосбережения (к счастью!), Что метод, который я ранее успешно использовал (используя BroadcastReceiver и AlarmManager.setRepeating), похоже, больше не работает надежно на моем новом телефоне (работаетс Android 8).В какой-то момент уведомление больше не будет обновляться (например, после отключения экрана в течение нескольких минут).

Теперь я наткнулся на множество различных подходов для решения этой проблемы, что янемного потерянный между ними, например:

  • с использованием цепочки AlarmManager.setAndAllowWhileIdle вместо setRepeating
  • с использованием WakefulBroadcastReceiver s (хотя уже снова устарел)
  • с использованием IntentService вместо BroadcastReceiver
  • с использованием JobIntentService вместо IntentService
  • с использованием JobScheduler вместо AlarmManager

Кто-нибудь нашел надежный способ частого обновления уведомления в строке состояния?Для меня не важно обновлять его точно каждые X секунд, просто это должно происходить каждые несколько минут и не быть случайным образом поврежденным после того, как устройство какое-то время находилось в глубоком сне.

1 Ответ

0 голосов
/ 21 декабря 2018

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

Я понимаю, что на этот вопрос сложно ответить из-за разных производителей и телефонов, включая различные типы настроек энергосбережения.Но в любом случае, вот что я придумал через некоторое время.Проблема в моем случае заключалась в том, что в Android 8+ Google сильно ограничил предоставленную возможность выполнять работу для BroadcastReceiver s, IntentServices и так далее в пользу использования JobScheduler.Это делает обязательным использование JobIntentService, обеспечивая необходимые функции для Android 8+, а также обратную совместимость для версий Android <8. </p>

tl; dr:

  • У вас есть JobIntentService, где вы, что вы должны делать внутри onHandleWork
  • У вас есть BroadcastReceiver, где в onReceive() вы просто звоните своим JobIntentService enqueueWork() method.
  • Используйте AlarmManager внутри JobIntentService#onHandleWork(), чтобы запланировать (например, используя setInexactRepeating()) и отменить PendingIntent трансляцию для вашего BroadcastReceiver.
...