Многие из нас знают, что (в свободном выражении) a Service
в Android будет убит системой, если он не называет Service.startForeground()
. Но разве это вся история...?
Я работаю над некоторым устаревшим кодом, портируя приложение "системное" разрешение в Play Store. Это приложение имеет 5 справочных служб (которые не вызывают startForeground()
), которые до сих пор были безопасными из-за "системного" разрешения, с которым приложение работало. Он был установлен на пользовательском устройстве. Из-за жестких временных рамок и бюджетов рефакторинг этих 5 в 1 не является краткосрочным решением, но мы хотели бы как можно скорее перейти к открытой бета-версии.
Короткий вопрос:
- Если нет переднего плана
Activity
илиService
, удаляет ли Android каждую отдельную фоновую службу или просто убивает сам процесс?
Ниже приведена информация из документов Android на Процессах и потоках, в которых обсуждается, как Android прекратит процессы, когда находится под давлением:
Android может решить завершить процесс в какой-то момент, когда память является низким и требуется другими процессами, которые являются более обслуживающий пользователя. Компоненты приложения, работающие в процессе, который убиты, следовательно, уничтожены. Процесс запускается снова для эти компоненты, когда они снова работают для них.
Когда вы решаете, какие процессы убивать, система Android весит их относительное значение для пользователя. Например, он более легко закрывается действия по хостингу процесса, которые больше не видны на экран, по сравнению с процессом, в котором присутствуют видимые действия. Решение поэтому, чтобы прекратить процесс, следовательно, зависит от состояния компонентов, работающих в этом процессе....
Общие знания говорят, что "Android убьет службу"
Личный опыт показал, что Android также убьет сам процесс (как описано в цитате выше). Это можно показать, сохранив объекты в объекте Application
и отметив, что после перезапуска службы они повторно инициализируются.
С учетом вышеизложенного существует несколько вариантов решения проблемы:
1) Сделайте правильную вещь
Реорганизовать 5 сервисов в 1, работающих на разных потоках. Принесите 1 сервис на передний план. Проблема решена.
К сожалению, для этого нет бюджета, и мы предпочли бы найти быстрое решение из-за сроков выполнения проекта.
Это окончательное решение, которое будет реализовано в будущем в полном объеме.
2) Многие уведомления
Запустите каждую службу на переднем плане, каждая со своим значком Notification
.
Это грязное решение, но оно будет работать на бета-полевых испытаниях, купив нам некоторое время.
Я думаю об этом как о подходе "грубой силы".
3) Процесс, защищенный одной службой
Если это процесс, который убит, а не каждая отдельная служба, тогда он будет достаточно хорош, чтобы запустить один запуск переднего плана.
Это предотвратит "предотвращение" (т.е. вероятность того, что Android) будет убивать процесс.
Таким образом, сохранится все 5 сервисов.
4) Одна служба, чтобы управлять ими все
docs on Services сообщают нам, что если служба привязана к другому контексту, то
stopService() или stopSelf() фактически не останавливает службу до тех пор, пока все клиенты отсоединяют.
Если я привяжусь к другим службам из одной службы переднего плана, сохранит их все в живых?
Итак:
- Удаляет ли Android каждую несвязанную, фоновую службу?
- Или просто убить виртуальную машину, в которой работает приложение?
Update
После 18 41 часа тестирования №3 (процесс защищен одним сервисом) все 6 служб все еще работают (5 старых плюс 1 новый).
Итак, похоже, что Android будет убивать процесс, если не выполняются действия или службы переднего плана.