一、安卓四種啟動(dòng)模式
1、Standard 標(biāo)準(zhǔn)模式
- 說明: 默認(rèn)模染苛,每次啟動(dòng)一個(gè)Activity都會(huì)又一次創(chuàng)建一個(gè)新的實(shí)例入棧,無論這個(gè)實(shí)例是否存在主到。
- 生命周期:每次創(chuàng)建實(shí)例Activity它的onCreate茶行、onStart贸呢、onResume都會(huì)被調(diào)用。
-
舉例:
2拢军、SingleTop 棧頂復(fù)用模式
- 說明:分兩種處理情況:須要?jiǎng)?chuàng)建的Activity已經(jīng)處于棧頂時(shí)楞陷,此時(shí)會(huì)直接復(fù)用棧頂?shù)腁ctivity;若須要?jiǎng)?chuàng)建的Activity不處于棧頂茉唉,此時(shí)會(huì)創(chuàng)建一個(gè)新的Activity入棧固蛾,同Standard模式一樣。
- 生命周期:若情況一中棧頂?shù)腁ctivity被直接復(fù)用時(shí)度陆,它的onCreate艾凯、onStart不會(huì)被系統(tǒng)調(diào)用,由于它并沒有發(fā)生改變懂傀。而是一個(gè)新的方法onNewIntent會(huì)被回調(diào)(Activity被正常創(chuàng)建時(shí)不會(huì)回調(diào)此方法)趾诗。
-
舉例:
2、SingleTask 棧內(nèi)復(fù)用模式
- 說明:若須要?jiǎng)?chuàng)建的Activity已經(jīng)處于棧中時(shí)蹬蚁,此時(shí)不會(huì)創(chuàng)建新的Activity恃泪,而是其上面的其他Activity全部銷毀,使其成為棧頂犀斋。
- 生命周期:同SingleTop 模式中的情況一同樣贝乎。僅僅會(huì)又一次回調(diào)Activity中的 onNewIntent方法
-
舉例:
4、SingleInstance 單實(shí)例模式
-
說明: SingleInstance比較特殊叽粹,是全局單例模式览效,是一種加強(qiáng)的SingleTask模式。它除了具有它所有特性外虫几,還加強(qiáng)了一點(diǎn):具有此模式的Activity僅僅能單獨(dú)位于一個(gè)任務(wù)棧中锤灿。
這個(gè)經(jīng)常使用于系統(tǒng)中的應(yīng)用,比如Launch辆脸、鎖屏鍵的應(yīng)用等等但校,整個(gè)系統(tǒng)中僅僅有一個(gè)! - 舉例:比方 A Activity是該模式每强,啟動(dòng)A后始腾。系統(tǒng)會(huì)為它創(chuàng)建一個(gè)單獨(dú)的任務(wù)棧,由于棧內(nèi)復(fù)用的特性空执。興許的請(qǐng)求均不會(huì)創(chuàng)建新的Activity,除非這個(gè)獨(dú)特的任務(wù)棧被系統(tǒng)銷毀穗椅。
二.啟動(dòng)模式的使用方式
1辨绊、在 Manifest.xml中指定Activity啟動(dòng)模式
<activity android:name="..activity.MultiportActivity" android:launchMode="singleTask"/>
2、啟動(dòng)Activity時(shí)匹表,在Intent中指定啟動(dòng)模式去創(chuàng)建Activity
Intent intent = new Intent();
intent.setClass(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
注意:以上兩種方式都能夠?yàn)锳ctivity指定啟動(dòng)模式门坷,可是二者還是有差別的宣鄙。
- (1)優(yōu)先級(jí):動(dòng)態(tài)指定方式比靜態(tài)指定優(yōu)先級(jí)要高,若兩者同時(shí)候存在默蚌,以動(dòng)態(tài)指定方式為準(zhǔn)冻晤。
- (2)限定范圍:靜態(tài)指定方式無法為Activity直接指定 FLAG_ACTIVITY_CLEAR_TOP 標(biāo)識(shí),動(dòng)態(tài)指定方式無法為Activity指定 singleInstance 模式绸吸。
三. Activity 的 Flags
1. FLAG_ACTIVITY_NEW_TASK
(1)首先會(huì)查找是否存在和被啟動(dòng)的Activity具有相同的親和性(即taskAffinity)的任務(wù)棧鼻弧;
(2)同一個(gè)應(yīng)用程序中的activity的親和性(taskAffinity)相同,默認(rèn)為包名
(3)如果有锦茁,則直接把這個(gè)棧整體移動(dòng)到前臺(tái)攘轩,并保持棧中舊activity的順序不變,然后被啟動(dòng)的Activity會(huì)被壓入棧
(4)如果沒有码俩,則新建一個(gè)棧來存放被啟動(dòng)的activity
<activity
android:name=".ui.activity.OtherTaskActivityXXX"
android:taskAffinity="android.task.browser"/> //注意這里的 taskAffinity
2. FLAG_ACTIVITY_SINGLE_TOP
作用是為Activity指定 “SingleTop”啟動(dòng)模式度帮,跟在AndroidMainfest.xml指定效果同樣。
3. FLAG_ACTIVITY_CLEAR_TASK
在新活動(dòng)啟動(dòng)前稿存,與新活動(dòng)關(guān)聯(lián)的任務(wù)被清空笨篷。也就是說,新活動(dòng)成為新任務(wù)的根瓣履,舊的活動(dòng)都被結(jié)束了冕屯。本flag只能與FLAG_ACTIVITY_NEW_TASK聯(lián)合使用。
4. FLAG_ACTIVITY_CLEAN_TOP
(1)當(dāng)前任務(wù)棧不存在要啟動(dòng)的Activity拂苹,同一般啟動(dòng)安聘;
(2)當(dāng)前任務(wù)棧已存在要啟動(dòng)的Activity:
- 啟動(dòng)模式默認(rèn)(multiple)并且不加FLAG_ACTIVITY_SINGLE_TOP,會(huì)清除自己及自己上面的任務(wù)瓢棒,然后在重新創(chuàng)建自己
- 其他啟動(dòng)模式浴韭,或者添加了FLAG_ACTIVITY_SINGLE_TOP,則只會(huì)清除自己上面的任務(wù)脯宿,然后調(diào)用自己的onNewIntent()
5. FLAG_ACTIVITY_REORDER_TO_FRONT
ABCD -> 再啟動(dòng)B -> ACDB
5.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有此標(biāo)記位的Activity不會(huì)出現(xiàn)在歷史Activity的列表中念颈,使用場(chǎng)景:當(dāng)某些情況下我們不希望用戶通過歷史列表回到Activity時(shí),此標(biāo)記位便體現(xiàn)了它的效果连霉。它等同于在xml中指定Activity的屬性:
android:excludeFromRecents="trure"
四. 啟動(dòng)模式的實(shí)際應(yīng)用場(chǎng)景
1. SingleTask模式的運(yùn)用場(chǎng)景
最常見的應(yīng)用場(chǎng)景就是保持我們應(yīng)用開啟后僅僅有一個(gè)Activity的實(shí)例榴芳。最典型的樣例就是應(yīng)用中展示的主頁(Home頁)。
假設(shè)用戶在主頁跳轉(zhuǎn)到其他頁面跺撼,運(yùn)行多次操作后想返回到主頁窟感,假設(shè)不使用SingleTask模式,在點(diǎn)擊返回的過程中會(huì)多次看到主頁歉井,這明顯就是設(shè)計(jì)不合理了柿祈。
2. SingleTop模式的運(yùn)用場(chǎng)景
假設(shè)你在當(dāng)前的Activity中又要啟動(dòng)同類型的Activity,此時(shí)建議將此類型Activity的啟動(dòng)模式指定為SingleTop,能夠降低Activity的創(chuàng)建躏嚎,節(jié)省內(nèi)存蜜自!
3. 注意:復(fù)用Activity時(shí)的生命周期回調(diào)
當(dāng)一個(gè)Activity設(shè)置了SingleTop或者SingleTask模式后,這時(shí)我們須要另外一個(gè)回調(diào) onNewIntent(Intent intent)方法卢佣。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);
initData();
initView();
}