首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 不按返回鍵跳轉回上一個 Activity:finish() 與啟動模式

     編輯:程式設計綜合問答

場景

A Activity 啟動 B Activity,在 B 中點擊按鈕返回 A,**不按系統返回鍵**,且希望 A 的 onCreate 重新執行 (或不執行)。

方案一:finish() 返回上一個 Activity (標準棧邏輯)

B Activity 中:


button2.setOnClickListener(v -> finish());

效果:B 銷毀,A 重新顯示,**A 的 onCreate 不會再次調用**,而是走 onRestart -> onStart -> onResume。A 保持原有狀態 (成員變量、視圖狀態)。

方案二:重新啟動 A Activity (強制 onCreate)

若需 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 會調用**。

方案三:startActivityForResult / Activity Result API (現代)

若 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 的回調

啟動模式對照表

需求標誌位 / launchModeA 生命周期
單純返回上一頁finish()onRestart->onStart->onResume
返回並刷新數據finish() + A 中 onResume 刷新同上,手動刷新
強制重新創建 AFLAG_ACTIVITY_NEW_TASK | CLEAR_TASKonCreate (新實例)
單例模式 (棧內唯一)Manifest: android:launchMode="singleTop"onNewIntent (不重建)
結果回調模式startActivityForResult / ActivityResultAPIonActivityResult / 回調

總結

  • **最簡單、標準**:B 中 finish(),A 保持狀態恢復顯示。
  • **需 A 刷新**:A 的 onResume 中加載最新數據,或用 ActivityResultAPI 回調。
  • **需強制重建 A**:帶 NEW_TASK | CLEAR_TASK 啟動 A 並 finish() B。
  • **避免**:在 B 中 startActivity(new Intent(B, A)) 而不 finish B,會導致棧中出現多個 A 實例 (A->B->A->B...)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved