無法保證在進程被系統殺死(用戶滑動關閉、內存不足回收)後仍能發送請求。 Android 系統不允許應用在進程銷毀後繼續執行代碼(無法常駐內存)。
// Activity/Fragment 中
private void exitApp() {
// 1. 顯示加載狀態
showLoading("正在退出...");
// 2. 發送退出請求(同步或異步均可,視業務)
ApiService.logout(new Callback() {
@Override
public void onSuccess(Response resp) {
// 3. 請求成功/失敗後,真正結束進程
finishAffinity(); // 關閉所有 Activity
System.exit(0); // 確保進程退出
}
@Override
public void onFailure(Throwable t) {
// 即使失敗也要退出,避免卡死
finishAffinity();
System.exit(0);
}
});
}
| 生命周期 | 觸發時機 | 能否發送網絡請求 |
|---|---|---|
| onPause | Activity 失去焦點 | 可,但用戶可能只是切換應用 |
| onStop | Activity 完全不可見 | 可,但同樣非真正退出 |
| onDestroy | Activity 銷毀(配置變更、finish、系統回收) | 不可靠:系統回收進程時不調用,或執行時間極短(<5ms)會被殺死 |
若業務允許「延遲幾分鐘送達」,可使用 `WorkManager` 排期一次性任務:
OneTimeWorkRequest logoutWork = new OneTimeWorkRequest.Builder(LogoutWorker.class)
.setInitialDelay(1, TimeUnit.MINUTES) // 給系統喘息時間
.build();
WorkManager.getInstance(context).enqueue(logoutWork);
// LogoutWorker.doWork() 中發送請求,返回 Result.success()
優點:即使進程被殺,系統會在適當時機重啟進程執行 Worker。
缺點:非實時、需處理重複執行冪等性。