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

Activity 跳轉不刷新頁面:singleTop 模式與 onResume 協作機制

     編輯:程式設計疑難解答

問題現場

使用 startActivity(intent) 跳轉時,目標 Activity 每次都重新走 onCreate → onStart → onResume 生命周期,導致界面閃爍、數據重載、滾動位置重置。

核心解決方案:launchMode="singleTop"

<!-- AndroidManifest.xml -->
<activity
    android:name=".TargetActivity"
    android:launchMode="singleTop" />

為什麼有效?

  • standard(默認):每次啟動創建新實例,棧頂疊加多個同類 Activity。
  • singleTop:若目標 Activity 已位於任務棧頂,**不創建新實例**,而是調用現有實例的 onNewIntent(Intent intent) 方法。

關鍵協作:處理 onNewIntent 與 onResume

@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 三部曲,實現頁面無感復用與智能刷新。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved