希望在不啟動新 Activity 的情況下清除當前任務棧中的歷史記錄,例如用戶登錄成功後返回主頁,防止按 Back 鍵返回登錄頁。
在需要自動銷毀的 Activity 標籤中添加:
<activity
android:name=".LoginActivity"
android:noHistory="true"
>
</activity>
效果:用戶離開該 Activity(啟動新 Activity 或按 Home)時,系統自動調用 finish() 將其從棧中移除。按 Back 鍵不會返回該 Activity。
Intent intent = new Intent(CurrentActivity.this, TargetActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(intent);
效果:TargetActivity 不會加入任務棧,離開即銷毀。適用於動態決定是否保留歷史的場景。
| 維度 | android:noHistory | FLAG_ACTIVITY_NO_HISTORY |
|---|---|---|
| 作用範圍 | 該 Activity 所有啟動方式 | 僅當前 Intent 啟動 |
| 靈活性 | 靜態、全局生效 | 動態、可條件控制 |
| 適用場景 | 登錄頁、引導頁、支付結果頁等絕不需返回 | 條件性跳轉、臨時頁面 |
| onSaveInstanceState | 不調用 | 不調用 |
若需「啟動新 Activity 並清除棧中它之上的所有 Activity」,使用標準 Flag 組合:
Intent intent = new Intent(CurrentActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish(); // 可選:結束當前 Activity
CLEAR_TOP:若目標 Activity 已在棧中,清除它之上的所有 Activity。NEW_TASK:在新任務中啟動(配合 CLEAR_TASK)。CLEAR_TASK:清除目標任務中所有 Activity(API 11+)。FLAG_ACTIVITY_CLEAR_TOP 單獨使用時,若目標不在棧中則會創建新實例,不會清空整個棧。noHistory 或 FLAG_ACTIVITY_NO_HISTORY 實現「用完即銷毀」語義。