Android-сервис убит - PullRequest
       3

Android-сервис убит

14 голосов
/ 15 июня 2010

У меня служба работает в том же процессе, что и мое приложение.

Иногда ОС Android решает убить мою службу (возможно, из-за нехватки памяти).

Мой вопрос:мое приложение будет уничтожено вместе со службой?или как это работает точно?

Спасибо!

Ответы [ 3 ]

35 голосов
/ 15 июня 2010

Сначала обязательно прочитайте: http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

Ключом к этому является то, что в Android процесс - это просто контейнер для кода - или, в частности, один или несколько компонентов (действия, службы, получатели, поставщики). По умолчанию все компоненты в .apk получают свой собственный выделенный процесс, в котором они все запускаются вместе. Это почти всегда то, что вы хотите.

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

Когда пользователь больше не взаимодействует напрямую с процессом, он становится расходуемым по сравнению с другими процессами, как описано в ссылочной документации. То есть пустые процессы (без интересных компонентов) будут уничтожены до процессов, содержащих действия, которые использовал пользователь, которые будут уничтожены до процессов с запущенными службами. Таким образом, наличие работающей службы будет способствовать сохранению вашего процесса за счет других процессов.

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

В результате для нормальных служб, которые работают долго, ожидается, что их процесс будет убит через некоторое время. Это не должно останавливать службу; служба, которая хочет продолжить работу, сделает это, ее просто нужно будет создать в новом процессе.

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

4 голосов
/ 15 июня 2010

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

Убийца с низким объемом памяти не пытается уничтожить какие-либо объекты в вашем процессе, хотя менеджер операций может вызывать onDestroy для объектов Activity, которые больше не нужны. Но это происходит как часть обычного жизненного цикла активности, а не из-за нехватки памяти.

(Кстати, мне неясно, имеете ли вы в виду «приложение» в целом, или ваш объект, который расширяет приложение, или вы имеете в виду ваши действия, которые показывают пользовательский интерфейс).

1 голос
/ 15 июня 2010

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

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

Кстати, я не опытный разработчик Android, но я думаю, что это то, что я узнал, просмотрев видео о жизненном цикле разработки Android от Google

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...