A Activity 啟動 B Activity,在 B 中點擊按鈕返回 A,**不按系統返回鍵**,且希望 A 的 onCreate 重新執行 (或不執行)。
B Activity 中:
button2.setOnClickListener(v -> finish());
效果:B 銷毀,A 重新顯示,**A 的 onCreate 不會再次調用**,而是走 onRestart -> onStart -> onResume。A 保持原有狀態 (成員變量、視圖狀態)。
若需 A 完全重新創建:
// B 中
Intent intent = new Intent(BActivity.this, AActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
標誌位組合含義:
CLEAR_TOP:棧中有 A 實例則清除其上所有 Activity (包括 B),重用該 A 實例 (調用 onNewIntent)。NEW_TASK | CLEAR_TASK:在新任務中啟動,**強制創建新 A 實例**,舊任務所有 Activity 銷毀。**onCreate 會調用**。若 B 是為 A 服務 (如選擇文件、拍照),應用結果回調模式:
// A 中 (Activity Result API, AndroidX)
ActivityResultLauncher launcher = registerForActivityResult(
new ActivityResultContracts.StartActivityForResult(),
result -> {
if (result.getResultCode() == RESULT_OK) {
Intent data = result.getData();
// 處理返回數據
}
}
);
void startB() {
Intent intent = new Intent(this, BActivity.class);
launcher.launch(intent);
}
// B 中返回結果
Intent result = new Intent();
result.putExtra("selected", "value");
setResult(RESULT_OK, result);
finish(); // 返回 A,觸發 A 的回調
| 需求 | 標誌位 / launchMode | A 生命周期 |
|---|---|---|
| 單純返回上一頁 | finish() | onRestart->onStart->onResume |
| 返回並刷新數據 | finish() + A 中 onResume 刷新 | 同上,手動刷新 |
| 強制重新創建 A | FLAG_ACTIVITY_NEW_TASK | CLEAR_TASK | onCreate (新實例) |
| 單例模式 (棧內唯一) | Manifest: android:launchMode="singleTop" | onNewIntent (不重建) |
| 結果回調模式 | startActivityForResult / ActivityResultAPI | onActivityResult / 回調 |
finish(),A 保持狀態恢復顯示。onResume 中加載最新數據,或用 ActivityResultAPI 回調。NEW_TASK | CLEAR_TASK 啟動 A 並 finish() B。startActivity(new Intent(B, A)) 而不 finish B,會導致棧中出現多個 A 實例 (A->B->A->B...)。