Как избежать системного убийства службы, когда приложение/деятельность убита


У меня есть приложение с одним activity и одним service. Если я убью activity, пока service работает, его тоже убьют. Для меня очень важно, чтобы служба не погибла. Как сделать так, чтобы, когда система убивает (или Я убиваю ее, очистив список "последние приложения") activity service все еще оставался активным, пока он не закончит свою работу? Заранее спасибо!

3 5

3 ответа:

Для меня очень важно, чтобы служба не погибла

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

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

Я показываю окно из этого сервиса, так что если сервис останавливается, то окно исчезает.

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

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

Вы можете попробовать вернуться START_STICKY из onStartCommand к вашим услугам:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    handleCommand(intent);
    // We want this service to continue running until it is explicitly
    // stopped, so return sticky.
    return START_STICKY;
}

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

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