使用 startActivity(intent) 跳轉時,目標 Activity 每次都重新走 onCreate → onStart → onResume 生命周期,導致界面閃爍、數據重載、滾動位置重置。
<!-- AndroidManifest.xml -->
<activity
android:name=".TargetActivity"
android:launchMode="singleTop" />
onNewIntent(Intent intent) 方法。@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent); // 關鍵:更新 getIntent() 返回值,否則 onResume 獲取舊 Intent
// 解析新 Intent 數據,更新 UI 局部而非全量刷新
updateViewFromIntent(intent);
}
@Override
protected void onResume() {
super.onResume();
// 檢查是否需要刷新:避免從其他頁面返回時誤觸發
if (needRefresh) {
refreshData();
needRefresh = false;
}
}
| launchMode | 適用場景 | 數據刷新策略 |
|---|---|---|
| singleTop | 通知欄點擊進入詳情、搜索結果頁反複進入 | onNewIntent + 局部更新 |
| singleTask | 主頁、登錄頁(棧內單例) | onNewIntent + clearTop 行為 |
| singleInstance | 全局唯一頁面(如來電界面) | 獨立任務棧,極少用 |
onNewIntent 中調用 setIntent(intent),否則 getIntent() 仍返回舊 Intent。onActivityResult 或使用 startActivityForResult / ActivityResultContracts 配合 onResume 旗標處理。掌握 singleTop + onNewIntent + onResume 三部曲,實現頁面無感復用與智能刷新。