Ответ
Система может перезапустить Service в следующих случаях:
-
Нехватка памяти – если система убивает процесс из-за нехватки ресурсов, сервис с
START_STICKYилиSTART_REDELIVER_INTENTбудет перезапущен автоматически. -
Возврат из onStartCommand() – если сервис возвращает
START_STICKY, система попытается пересоздать его после смерти процесса. Если возвращаетSTART_REDELIVER_INTENT, то перезапустит с последним интентом. -
Явный вызов startService() – если сервис был остановлен, но снова вызван через
startService().
Пример:
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return START_STICKY // или START_REDELIVER_INTENT
} Ответ 18+ 🔞
А, слушай, вот тебе наглядный пример, как эта система может взять и перезапустить твой Service на ровном месте. Сидит он себе, работает, и тут — бац! — его нет. А потом он снова есть. Магия, блядь? Нет, просто Android, ёпта.
Итак, сценарии, когда эта мартышлюшка может ожить:
-
Нехватка памяти. Это классика, ебать мои старые костыли. Системе не хватает оперативки, она смотрит на твой сервис и думает: "А пошёл ты на хуй, ядрёна вошь". И убивает его процесс. Но если ты в
onStartCommandвернулSTART_STICKYилиSTART_REDELIVER_INTENT, система, немного постыдившись, сама же его и пересоздаст, как ни в чём не бывало. Типа "ой, сорян, братан, на тебе твой сервис обратно". -
Возврат из
onStartCommand(). Вот тут вся магия и завязана. Что ты вернёшь, то и получишь. ВернулSTART_STICKY— система попытается пересоздать сервис, но уже без того интента, с которым его убили. ВернулSTART_REDELIVER_INTENT— ну тут вообще красота, система не только сервис вернёт, но и последний интент ему вручит, типа "держи, мы тут всё сохранили, извини за неудобства". -
Явный вызов
startService(). Ну тут всё просто, как три копейки. Сервис остановили, а потом ты или кто-то другой такой: "А давайте-ка его ещё раз запустим!" И понеслась. Никакой магии, просто команда.
Вот смотри, как это в коде выглядит, проще некуда:
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// Тут твоя бизнес-логика, которая может в любой момент накрыться медным тазом
return START_STICKY // Или START_REDELIVER_INTENT — выбирай, что тебе больше по душе
}
Вот и вся философия. Сделал правильно — сервис будет как кошка, которая гуляет сама по себе, но всегда возвращается. Сделал криво — он просто сдохнет, и доверия ебать ноль, что он воскреснет.