Фоновая служба Android останавливается при запуске других приложений

В настоящее время я пытаюсь создать приложение для Android, которое никогда не заканчивается (перезапускается при зависании/остановке/пролистывании/убийстве и т. д.) для определенного использования.

Поэтому я использую фоновую службу с onTaskRemoved() для перезапуска службы при удалении из списка последних приложений. Также START_STICKY, чтобы он продолжал работать в фоновом режиме.

Мое приложение хорошо реагирует на мой голос (оно показывает тост), когда поверх него запущено не так много новых приложений. Но когда пролетает какое-то время или поверх него запущено 3-4 приложения, он просто зависает (не реагирует на мой голос).

Есть ли способ заставить мое приложение всегда работать поверх других приложений (например, всегда поверх списка последних приложений, который отображается при нажатии кнопки «Домой» в течение нескольких секунд), или просто перезапустить приложение, если оно зависло?

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

Спасибо :)


person joony0123    schedule 24.03.2017    source источник


Ответы (1)


Для Android не останавливайте службу, которую вы можете вызвать startForeground()

Однако некоторые сервисы будут упущены пользователем, если они таинственным образом исчезнут. Например, приложение музыкального проигрывателя по умолчанию, поставляемое с Android, использует службу для фактического воспроизведения музыки. Таким образом, пользователь может слушать музыку, продолжая использовать свой телефон для других целей. Служба останавливается только тогда, когда пользователь входит и нажимает кнопку остановки в музыкальном проигрывателе. Если бы эта служба была неожиданно закрыта, пользователь мог бы задаться вопросом, что не так.

Подобные сервисы могут объявлять себя частью «переднего плана». Это повысит их приоритет и снизит вероятность их выбивания из памяти. Компромисс заключается в том, что служба должна поддерживать уведомление, поэтому пользователь знает, что эта служба претендует на часть переднего плана. И, в идеале, это уведомление обеспечивает простой путь назад к некоторым действиям, когда пользователь может остановить службу.

Для этого в onCreate() вашей службы (или где-либо еще в жизни службы это имело бы смысл) вызовите startForeground(). Для этого требуется уведомление и локально уникальное целое число, точно так же, как метод notify() в NotificationManager. Это вызывает появление уведомления и переводит службу в приоритет переднего плана. Позже вы можете вызвать stopForeground(), чтобы вернуться к нормальному приоритету.

person user60108    schedule 24.03.2017