Как сохранить Android ForegroundService на неопределенный срок в новых версиях Android? - PullRequest
0 голосов
/ 13 марта 2020

Я заканчиваю колледж информатики и в качестве дипломного проекта хочу создать приложение Android, которое контролирует батарею пользователя и затем может использовать root, чтобы отключить зарядку телефона. Первым шагом является мониторинг батареи и характера использования пользователя и предложить им некоторую статистику.

Для мониторинга батареи я использую службу переднего плана, которая время от времени запрашивает состояние батареи через широковещательный приемник для события ACTION_BATTERY_CHANGED. Но у меня проблемы с поддержанием моего обслуживания на переднем плане. Он продолжает работать в течение 10-15 минут, но в конечном итоге он убивается системой (я подумал, может быть, это потому, что события происходили довольно редко). Я также пытался использовать сопрограммы, чтобы отложить запрос и делать это вручную каждую 1 минуту, а затем даже чаще, например, 30 секунд, но моя служба все равно со временем будет убита и не будет запущена снова в ближайшем будущем, даже если она запущена с START_STICKY , Я также пытался настроить аварийные сигналы с помощью AlarmManager, чтобы время от времени перезапускать мой сервис, но я все еще не могу получить согласованную схему данных батареи, чтобы иметь возможность анализировать и строить алгоритм оценки для ядра моего проекта.

Я использую Android 9 на OnePlus 5T в качестве тестового устройства, и мне действительно тяжело поддерживать службу на переднем плане. Но я заметил, что есть приложения, такие как Mi Fit, Mi Band Tools или даже , это аккумуляторное приложение, которые могут каким-то образом перезапустить свои службы переднего плана, когда их остановят. Я вижу, как загорается мой экран и показывает, что одно из этих приложений было остановлено, но когда я открываю свои уведомления, я вижу, что уведомление для переднего плана все еще существует для этого приложения, так что, вероятно, оно было сразу же перезапущено (но когда то же самое происходит для моего приложения, уведомления на переднем плане больше нет).

Я также попытался переопределить OnDestroy внутри своего сервиса и перезапустить его оттуда, но кажется, что метод OnDestroy не вызывается Система просто убивает процесс, вероятно, когда требуется больше памяти. Я также не могу использовать BroadcastReceiver s, зарегистрированные в Manifest, потому что они больше не работают с Android 8+ (что рекомендуется делать в большинстве уроков).

Я прочитал все, что мог возьмите в руки эту топи c и ничего не получалось .. Лучшим подходом была установка будильника через AlarmManager, но даже это перестало работать через несколько часов, но почему-то другие приложения продолжают работать, и мне интересно найти как я должен это сделать в более новых Android версиях (Android 8 и более предпочтительно).

Спасибо!

1 Ответ

0 голосов
/ 13 марта 2020

С помощью Workmanager запустите PeriodicWork и проверьте, запущена ли служба переднего плана, если нет, запустите службу внутри doWork() метода

...