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

Android Activity 切換不重建:launchMode 單一實例模式詳解

     編輯:程式設計疑難解答

核心解答

在 AndroidManifest.xml 中為 Activity 設定 android:launchMode,控制實例創建與復用行為。

四種 launchMode 對比

模式行為適用場景生命週期
standard (預設)每次啟動**新建實例**,疊加棧頂普通頁面、列表詳情完整走 onCreate→onDestroy
singleTop若實例已在棧頂,**復用並觸發 onNewIntent**通知點擊進入聊天頁、搜尋結果頁不走 onCreate,走 onNewIntent→onResume
singleTask任務棧內**單一實例**,啟動時清除其上所有實例主頁、入口頁、登錄後首頁同 singleTop
singleInstance**獨佔任務棧**,全系統僅一實例極少用(來電、鎖屏介面)同 singleTop

你的場景推薦:singleTop 或 singleTask

<activity
    android:name=".MainActivity"
    android:launchMode="singleTop" >  <!-- 或 singleTask -->
</activity>
  • singleTop:若從列表頁 A 跳轉詳情頁 B,再從 B 返回 A,**A 不重建**,觸發 onNewIntent 可刷新數據。
  • singleTask:若 A 為主入口,任何入口跳回 A 都**清空棧上頁面**,確保唯一實例。

配合 Intent Flag 動態控制

// 單次啟動表現為 singleTop
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

// 清空目標之上的 Activity(類 singleTask 效果)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

// 完全重新建立任務棧(如登出後跳登錄頁)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Fragment 方案為何更適合「不刷新切換」?

你提到的「兩個列表頁切換不刷新」本質是**同一個 Activity 內的視圖切換**,用 Fragment + ViewPager 或 FragmentTransaction.hide/show 才是正統做法:

  • 生命週期受宿主 Activity 管理,setUserVisibleHint/onHiddenChanged 控制加載邏輯。
  • 狀態天然保留(列表滾動位置、輸入框內容),無需額外代碼。
  • 避免 Activity 切換動畫、白屏、記憶體抖動。

總結

launchMode 控制 Activity 實例復用,可解決「跳轉不重建」。但若是「同功能不同分頁切換」,**請直接使用 Fragment**,這才是 Android 官方推薦的 UI 組合模式,別讓 Activity 背負不屬於它的責任。

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