2010-06-15 4 views
14

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

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

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

Спасибо!

ответ

35

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

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

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

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

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

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

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

+0

за ваш полезный ответ! так, чтобы быть более конкретным: я подклассом из приложения, и в нем я держу ссылку на свой объект службы. Когда моя служба будет убита, как я могу получить ссылку на новую? или мой объект приложения также умирает вместе, и когда он получает повторное создание экземпляра, все так же, как при первом запуске приложения? – Erdal

+2

Когда вы убиваете что-то для памяти, весь процесс (включая объект приложения) убивается, и в этот момент в нем не выполняется код. Если служба просто уничтожается, потому что ее больше не нужно запускать, вызывается ее onDestroy(), и когда служба позже понадобится, создается новый экземпляр и вызывается onCreate(). Лично я вообще рекомендую использовать приложение; это на самом деле не дает вам ничего, кроме использования статических одноэлементных классов, и я думаю, что это создает ожидания для людей (w.r.t., если существует более традиционная модель приложения), которые на самом деле не выполняются. – hackbod

+0

Я понимаю, что вы имеете в виду. Единственная проблема, с которой я столкнулся, заставляя меня использовать класс Application, заключалась в том, что я не хотел привязываться к Сервису из всех моих разных действий. Я связываюсь только с вызовом во время метода onCreate моего приложения, а затем все другие действия получают доступ к Сервису через мое приложение singleton. Не могли бы вы предложить что-то лучше? – Erdal

3

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

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

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

+0

по приложению Я имею в виду мой объект, который простирается от приложения – Erdal

1

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

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

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

+1

Определенно не создавайте другой проект. Также не выполняйте сервис в другом процессе (через android: process), за исключением особых условий. – hackbod

+0

Да, я пытаюсь сохранить свое обслуживание в том же процессе. Скорее всего, быстрее и проще для меня просто вызвать статические методы, чем реализовать aidl – Erdal

Смежные вопросы