Как принудительно перезапустить службу?

У меня есть фоновый сервис, который иногда убивается ОС, когда он работает с низким объемом памяти.

  1. Как имитировать такое поведение, чтобы я мог его отладить?

В руководстве dev просто говорится: «Если ваша служба запущена, тогда вы должны разработать ее, чтобы изящно обрабатывать перезагрузки системой. Если система убивает вашу службу, она перезапускает ее, как только ресурсы становятся доступными снова».

  1. Какова последовательность вызовов от того, когда ее убивают, когда она заканчивает перезапуск?

Что касается побочного (связанного) вопроса, что происходит с активно запущенной AsyncTask, запущенной в сервисе, когда служба будет убита ОС, т. Е. Без вызова service.onDestroy? Продолжает ли он работать или разорваться вместе с сервисом?

Solutions Collecting From Web of "Как принудительно перезапустить службу?"

В более новых версиях служба будет иметь следующие события:

onCreate() 

С последующим…

 int onStartCommand(Intent intent, int flags, int startid) 

Я знаю, что в комментариях выше вы упоминаете об этом, но стоит повторить: не используйте старое событие onStart (). OnStartCommand – это новый способ делать вещи.

OnCreate () можно использовать для создания любых объектов и т. Д., Но на самом деле код вашего сервиса в onStartCommand ().

Когда закончите с onStartCommand (), вы должны вернуть результат. Использование «START_STICKY» сообщает операционной системе, что он может перезагрузиться, если ему нужно его убить. Использование «START_NOT_STICKY» сообщает os не беспокоить попытку перезапустить его после того, как память снова станет доступной. Это означает, что вашему приложению потребуется снова запустить службу вручную. Существуют и другие варианты – проверьте документы API.

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

Кроме того, рекомендуется сохранить поле startID в переменной и использовать его с stopSelfResult (startId), когда ваша служба будет запущена.

Имейте в виду, что если ваша служба убита ОС, у вас может не быть возможности хранить какие-либо переменные. Вы должны быть в состоянии видеть, является ли ваше состояние ожидаемым при перезапуске ОС, и если не просто сбросить все или грациозно умереть, возможно.

Что касается отладки, считаете ли вы, что вы пишете другое приложение, которое ничего не делает, кроме сосания памяти в Activity, чтобы вызвать низкое состояние памяти? Высшая активность должна отдавать предпочтение памяти и заставлять службу умирать.

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

Что-то еще, что может быть полезно для вас, – проверить, работает ли ваша служба внутри вашего приложения. Вот как это сделать:

 // Determine if one of my services is currently running public static boolean isMyServiceRunning(Context context, String servicename) { ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { if (servicename.equals(service.service.getClassName())) { return true; } } return false; } 

Если это локальная служба (по умолчанию), а не удаленная служба, она работает в том же процессе, что и ваше приложение. Это означает, что вы можете эмулировать убийство, просто убивая процесс вашего приложения. Вы можете сделать это с помощью ddms, например, в eclipse или из командной строки или даже с вашего телефона (настройки -> приложения).