Android не выгружает приложение вручную по finish()
Он убивает процесс (process-level cleanup) по следующим причинам:
Причина | Что происходит |
---|---|
Нехватка памяти | Android убивает least important process |
Приложение в фоне долго не используется | Может быть выгружено «тихо» через LMK |
Пользователь смахнул в Recents | Android убивает task + процесс |
Приложение само вызвало System.exit(0) или killProcess() | Принудительное завершение |
Force stop через Settings | Убивается процесс + запрещается автозапуск |
Кто именно убивает процесс?
Android использует два механизма:
- ActivityManagerService (AMS)
Решает, какие процессы можно убить => вызывает Process.killProcess(pid)
2. Low Memory Killer (LMK)
(на старых версиях Android < Q) Это ядреный механизм: ядро убивает процесс, основываясь на приоритетах и OOM score
Что происходит при убийстве?
onDestroy()
НЕ вызывается!
Android не успевает вызвать lifecycle-методы при принудительном убийствеViewModel
,Activity
,Application
— всё уничтожается
Только что было в памяти — пропадаетsavedInstanceState
может быть использован при пересоздании, если ты его сохранил
Под капотом — что делает AMS
- PID => SIGKILL (через Zygote)
- Удаляется
ProcessRecord
из AMS - Удаляется таск из
Recent Tasks
, если этоtask.removeTask = true
- Очистка всех
IBinder
-связей