forceStop 是 Android 系統提供的最強制進程終止手段,比 killProcess、System.exit() 更徹底。本文深度解析其工作原理、調用鏈路與實戰場景。
| 方式 | 觸發者 | 影響範圍 | 生命周期回調 | 可恢復性 |
|---|---|---|---|---|
finish() | App 自身 | 單 Activity | onDestroy() | 任務棧保留 |
System.exit(0) | App 自身 | 當前進程 | 無(JVM 直接退出) | 進程結束 |
android.os.Process.killProcess(pid) | App 自身/同 UID | 指定 PID 進程 | 無 | 進程結束 |
| forceStop | 系統/用戶/設備管理器 | 整個包名下所有進程 | 無 | 徹底清理,需重新啟動 |
ActivityManagerService.forceStopPackage()(系統服務端)。ActivityStackSupervisor.finishTopActivity()、ActiveServices.stopServiceLocked() 等。ProcessRecord 列表移除,取消所有待執行的 BroadcastQueue、ServiceRecord 超時消息。Process.killProcessQuiet(pid) 發送 SIGKILL(signal 9),進程無法捕獲、無法處理。FORCE_STOPPED,寫入 packages.xml,重啟前不可接收隱式廣播(如 BOOT_COMPLETED)。ActivityManagerService.killBackgroundProcesses() 升級為 forceStop。DevicePolicyManager.wipeData() 內部調用。adb shell am force-stop <pkg> 自動化測試前置清理。onPause() 即落盤,別賭 onDestroy()。onPause() 反註冊;靜態廣播聲明 android:directBootAware="true" 或避免依賴隱式廣播啟動核心邏輯。START_STICKY / START_REDELIVER_INTENT 配合 onStartCommand 重建邏輯。PackageManager.getPackageInfo(pkg, 0).applicationInfo.flags & ApplicationInfo.FLAG_FORCE_STOPPED 判斷是否被強停。# 強制停止
adb shell am force-stop com.example.app
# 查看包狀態
adb shell dumpsys package com.example.app | grep -i force
# 模擬低內存觸發
adb shell am kill-all
理解 forceStop,是構建健壯 Android 應用、應對系統級回收的必修課。