Activity 啟動(dòng)模式詳解及使用場(chǎng)景

????在 Android 中,Activity 啟動(dòng)模式(Launch Mode) 決定了 Activity 實(shí)例如何與任務(wù)棧(Task)交互,主要用于控制 Activity 的創(chuàng)建和復(fù)用邏輯。Android 提供了四種啟動(dòng)模式,通過(guò) android:launchMode 屬性或 Intent Flags 配置。以下是詳細(xì)說(shuō)明及使用場(chǎng)景:

1. standard(默認(rèn)模式)

行為:

????每次啟動(dòng) Activity 都會(huì)創(chuàng)建一個(gè)新的實(shí)例,無(wú)論任務(wù)棧中是否已存在該 Activity。

示例:

????啟動(dòng) ActivityA → ActivityA → ActivityA,任務(wù)棧中存在三個(gè) ActivityA 實(shí)例。

生命周期:

????每次創(chuàng)建新實(shí)例時(shí),依次調(diào)用 onCreate() → onStart() → onResume()。

使用場(chǎng)景:

????普通頁(yè)面跳轉(zhuǎn),無(wú)需復(fù)用實(shí)例(如列表頁(yè)跳詳情頁(yè))。

????需要多個(gè)相同 Activity 實(shí)例的場(chǎng)景(如多窗口聊天界面)。

2. singleTop(棧頂復(fù)用模式)

行為:

????若目標(biāo) Activity 已在棧頂:直接復(fù)用該實(shí)例,調(diào)用 onNewIntent(),不創(chuàng)建新實(shí)例。

????若目標(biāo) Activity 不在棧頂:創(chuàng)建新實(shí)例。

生命周期:

????復(fù)用棧頂實(shí)例時(shí),調(diào)用 onNewIntent() → onResume()

代碼示例:

<activity android:name=".DetailActivity" android:launchMode="singleTop" />

使用場(chǎng)景:

????防止快速點(diǎn)擊重復(fù)打開同一頁(yè)面(如支付確認(rèn)頁(yè))。

????通知欄點(diǎn)擊跳轉(zhuǎn)時(shí)避免重復(fù)創(chuàng)建實(shí)例。

3. singleTask(棧內(nèi)單例模式)

行為:

????若任務(wù)棧中存在目標(biāo) Activity 實(shí)例:清除該實(shí)例之上的所有 Activity,使其成為棧頂,并調(diào)用 onNewIntent()。

????若不存在:創(chuàng)建新實(shí)例,并放入當(dāng)前任務(wù)棧(或根據(jù) taskAffinity 匹配的棧)。

生命周期:

????復(fù)用實(shí)例時(shí),調(diào)用 onNewIntent() → onResume();被清除的 Activity 會(huì)觸發(fā) onDestroy()。

代碼示例:

<activity android:name=".MainActivity" android:launchMode="singleTask" />

使用場(chǎng)景:

????應(yīng)用主頁(yè)(如首頁(yè)),確保返回時(shí)回到主頁(yè)并清理其他頁(yè)面。

????登錄頁(yè),登錄成功后跳轉(zhuǎn)主頁(yè)并清除所有中間頁(yè)。

4. singleInstance(全局單例模式)

行為:

????目標(biāo) Activity 獨(dú)占一個(gè)任務(wù)棧,且該棧中只能有這一個(gè) Activity。

????再次啟動(dòng)時(shí),直接復(fù)用該實(shí)例(無(wú)論從哪個(gè)應(yīng)用啟動(dòng)),調(diào)用 onNewIntent()。

生命周期:

????復(fù)用實(shí)例時(shí),調(diào)用 onNewIntent() → onResume()。

代碼示例:

<activity android:name=".SplashActivity" android:launchMode="singleInstance" />

使用場(chǎng)景:

????獨(dú)立運(yùn)行的功能(如系統(tǒng)相機(jī)、撥號(hào)界面)。

????與其他應(yīng)用共享的 Activity(如地圖選點(diǎn)功能)。

任務(wù)棧(Task)與 taskAffinity

taskAffinity:

????每個(gè) Activity 的“任務(wù)棧歸屬標(biāo)識(shí)”,默認(rèn)與應(yīng)用的包名一致。

????可通過(guò) android:taskAffinity 指定自定義值,通常與 singleTask 或 singleInstance 配合使用。

示例場(chǎng)景:

<!-- 將支付頁(yè)綁定到獨(dú)立的任務(wù)棧 -->
<activity
    android:name=".PaymentActivity"
    android:launchMode="singleTask"
    android:taskAffinity="com.example.payment" />

????Intent Flags 與啟動(dòng)模式的關(guān)系
????通過(guò) Intent Flags 動(dòng)態(tài)控制啟動(dòng)行為(優(yōu)先級(jí)高于 android:launchMode):

????FLAG_ACTIVITY_NEW_TASK
????類似 singleTask,但依賴 taskAffinity 尋找或創(chuàng)建新棧。

????FLAG_ACTIVITY_SINGLE_TOP
????等價(jià)于 singleTop。

????FLAG_ACTIVITY_CLEAR_TOP
????若目標(biāo) Activity 已存在棧中,清除其上的所有 Activity。

總結(jié)對(duì)比表

啟動(dòng)模式 實(shí)例數(shù)量 任務(wù)棧規(guī)則 典型場(chǎng)景
standard 多個(gè) 默認(rèn)棧,允許重復(fù) 普通頁(yè)面跳轉(zhuǎn)
singleTop 棧頂唯一 復(fù)用棧頂實(shí)例,避免重復(fù)創(chuàng)建 防止快速重復(fù)打開
singleTask 棧內(nèi)唯一 清除上方 Activity,復(fù)用實(shí)例 主頁(yè)、登錄頁(yè)
singleInstance 全局唯一 獨(dú)占獨(dú)立任務(wù)棧 獨(dú)立功能(如相機(jī)、撥號(hào))

常見問(wèn)題

singleTask 和 singleInstance 的區(qū)別?

????singleTask 允許同一棧中存在其他 Activity,singleInstance 獨(dú)占整個(gè)棧。

如何選擇啟動(dòng)模式?

????根據(jù)頁(yè)面是否需要復(fù)用實(shí)例任務(wù)棧管理需求決定。優(yōu)先使用 singleTop 避免棧頂重復(fù),復(fù)雜場(chǎng)景用 singleTask

onNewIntent() 的作用?

????在復(fù)用 Activity 實(shí)例時(shí)傳遞新的 Intent 數(shù)據(jù),需在此方法中更新 UI 或邏輯。

通過(guò)合理配置啟動(dòng)模式,可以有效管理 Activity 生命周期和任務(wù)棧,提升用戶體驗(yàn)并優(yōu)化資源利用。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容