理解Activity的啟動(dòng)模式

Activity的啟動(dòng)模式有哪幾種,分別用于什么場景?

  • standard:標(biāo)準(zhǔn)模式

系統(tǒng)的默認(rèn)模式。一種典型的多實(shí)例實(shí)現(xiàn)。每次啟動(dòng)一個(gè)Activity都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例。被啟動(dòng)的Activity會(huì)被放入啟動(dòng)者的棧中,如果啟動(dòng)者是非Activity類型的Context(如ApplicationContext),并沒有所謂的任務(wù)棧,就會(huì)報(bào)錯(cuò),此時(shí)需為待啟動(dòng)的Activity指定FLAG_ACTIVITY_NEW_TASK標(biāo)記位,創(chuàng)建一個(gè)新棧。沒有特殊需求默認(rèn)是這種模式。

  • singleTop:棧頂復(fù)用模式

如果一個(gè)Activity的實(shí)例已經(jīng)在棧頂存在,啟動(dòng)這個(gè)Activity時(shí),不會(huì)創(chuàng)建新的Activity,而會(huì)回調(diào)onNewIntent(),如果不是在棧頂存在,則會(huì)新建一個(gè)實(shí)例。
適合接收通知啟動(dòng)的內(nèi)容顯示頁面。當(dāng)收到多條新聞推送時(shí),用于展示新聞的Activity設(shè)置成此模式,根據(jù)傳來的intent數(shù)據(jù)顯示不同的新聞信息,不會(huì)啟動(dòng)多個(gè)Activity。

  • singleTask:棧內(nèi)復(fù)用模式

一個(gè)單實(shí)例模式。只要Activity的實(shí)例在一個(gè)棧中存在,再次啟動(dòng)Activity都不會(huì)重新創(chuàng)建實(shí)例只會(huì)回調(diào)onNewIntent(),并從棧中彈出實(shí)例上面所有的實(shí)例。
適合作為程序入口點(diǎn),例如瀏覽器的主界面。不管從多少個(gè)不同應(yīng)用啟動(dòng)瀏覽器,只會(huì)啟動(dòng)主界面一次,其余情況都會(huì)走onNewIntent,并且會(huì)清空主界面上面的其他頁面。

  • singleInstance:單實(shí)例模式

具有singleTask的所有特性,設(shè)置此模式的Activity只能單獨(dú)存在一個(gè)任務(wù)棧中。

清晰地描述下onNewIntent和onConfigurationChanged這兩個(gè)生命周期方法的場景?

onNewIntent

在singleTop、singleTask、singleInstance模式下,啟動(dòng)相同的Activity,期望只有一個(gè)實(shí)例存在,再次啟動(dòng)就會(huì)調(diào)用onNewIntent()。在onNewIntent中可以setIntent(intent)刷新intent數(shù)據(jù)。

onConfigurationChanged

當(dāng)Android設(shè)備正在運(yùn)行App時(shí),如果設(shè)備的語言、屏幕方向、鍵盤的參數(shù)改變了,默認(rèn)會(huì)銷毀當(dāng)前Activity并重新創(chuàng)建一次來加載新的配置信息。為了防止Actitvity被系統(tǒng)銷毀,可以在AndroidManifest.xml文件中給<Activity>標(biāo)簽設(shè)置android:configChanges,可選值如下:

屬性值 含義
mcc SIM卡唯一標(biāo)識IMSI(國際移動(dòng)用戶標(biāo)識碼)中的國家代碼,由三位數(shù)字組成(中國為460)。 這里表示mcc發(fā)生了改變
mnc SIM卡唯一標(biāo)識IMSI(國際移動(dòng)用戶標(biāo)識碼)中的運(yùn)營商代碼,由兩位數(shù)字組成,中國移動(dòng)TD系統(tǒng)為00,中國聯(lián)通為01,電信為03。這里表示mnc發(fā)生了改變
locale 設(shè)備的本地位置發(fā)生了改變,一般指的是切換了系統(tǒng)語言
touchscreen 觸摸屏發(fā)生了改變
keyboard 鍵盤類型發(fā)生了改變,比如用戶使用了外接鍵盤
keyboardHidden 鍵盤的可訪問性發(fā)生了改變,比如用戶調(diào)出了鍵盤
navigation 系統(tǒng)導(dǎo)航方式發(fā)生了改變
screenLayout 屏幕布局發(fā)生了改變,很可能是用戶激活了另外一個(gè)顯示設(shè)備
fontScale 系統(tǒng)字體縮放比例發(fā)生了改變,比如用戶選擇了個(gè)新的字號
uiMode 用戶界面模式發(fā)生了改變,比如開啟夜間模式-API8新添加
orientation 屏幕方向發(fā)生改變,比如旋轉(zhuǎn)了手機(jī)屏幕
screenSize 當(dāng)屏幕尺寸信息發(fā)生改變(當(dāng)編譯選項(xiàng)中的minSdkVersion和targeSdkVersion均低于13時(shí)不會(huì)導(dǎo)致Activity重啟)—API13新添加
smallestScreenSize 設(shè)備的物理屏幕尺寸發(fā)生改變,這個(gè)和屏幕方向沒關(guān)系,比如切換到外部顯示設(shè)備—API13新添加
layoutDirection 當(dāng)布局方向發(fā)生改變的時(shí)候,正常情況下無法修改布局的layoutDirection的屬性—API17新添加

申明的配置發(fā)生改變時(shí),將不會(huì)重啟Activity,而是回調(diào)onConfigurationChanged。如果設(shè)置orientation,當(dāng)屏幕方向發(fā)生旋轉(zhuǎn)時(shí),會(huì)阻止系統(tǒng)銷毀Activity重建,而是保持運(yùn)行,回調(diào)Activity的onConfigurationChanged(),我們需要在這個(gè)方法中自己處理旋轉(zhuǎn)后的操作。onConfigurationChanged中會(huì)傳入一個(gè)Configuration對象,通過讀取對象中最新的配置信息,來自行適配新的UI界面。

從Android 3.2 (API13) 開始,當(dāng)設(shè)備旋轉(zhuǎn)時(shí),screenSize也會(huì)改變,因此需要設(shè)置android:configChange="orientation|screenSize"。

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

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

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