Сервис Android уничтожается

У меня есть Сервис, работающий в том же процессе как мое Приложение.

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

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

Спасибо!

14
задан Erdal 15 June 2010 в 01:09
поделиться

3 ответа

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

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

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

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

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

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

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

35
ответ дан 1 December 2019 в 06:59
поделиться

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

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

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

4
ответ дан 1 December 2019 в 06:59
поделиться

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

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

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

.
1
ответ дан 1 December 2019 в 06:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: