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

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

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

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

Спасибо!

Ответы

Ответ 1

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

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

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

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

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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