在 Activity 的 quitApplication() 中啟動 AsyncTask 執行耗時操作(獲取位置、解析 XML),但發現位置獲取成功而 XML 解析未執行。原因是主線程退出導致進程終止,AsyncTask 所在的後台線程被強制殺死。
AsyncTask 依賴於應用進程存活。當用戶點擊返回鍵或調用 finish() 導致所有 Activity 銷毀,系統可能立即回收進程,未完成的 AsyncTask 將被中斷。
將耗時操作移至 IntentService 或 JobIntentService,即使 Activity 銷毀也能繼續運行:
public class FinishService extends IntentService {
public FinishService() { super("FinishService"); }
@Override
protected void onHandleIntent(Intent intent) {
// 此處執行 getLocationSingle() 和 parseXML()
}
}
// Activity 中啟動
startService(new Intent(this, FinishService.class));
onTerminate() 僅在模擬器或特定情況下調用,真機極少觸發,不可靠。
若任務極快(<1秒),可用 CountDownLatch 等待:
CountDownLatch latch = new CountDownLatch(1);
new AsyncTask() {
protected Void doInBackground(Void... params) {
// 執行任務
latch.countDown();
return null;
}
}.execute();
try { latch.await(2, TimeUnit.SECONDS); } catch (InterruptedException e) {}
finish();
WorkManager(API 23+)調度可延遲、可持久化的後台任務。AsyncTask 中執行關鍵數據持久化操作。Foreground Service 配合 Notification 保證進程優先級。正確選擇後台執行機制,能避免應用退出導致數據丟失或邏輯中斷。