Activity的啟動(dòng)模式
Activity的LaunchMode
standard標(biāo)準(zhǔn)模式
系統(tǒng)的默認(rèn)模式,每次啟動(dòng)都會(huì)重新創(chuàng)建一個(gè)新的實(shí)例。
standard模式的Activity默認(rèn)會(huì)進(jìn)入啟動(dòng)它的Activity所屬的任務(wù)棧中,在使用ApplicationContext去啟動(dòng)standard模式的Activity的時(shí)候會(huì)運(yùn)行時(shí)異常。解決這個(gè)問(wèn)題的方法是為待啟動(dòng)的Activity指定FLAG_ACTIVITY_NEW_TASK標(biāo)記位,這樣啟動(dòng)的時(shí)候就會(huì)為它創(chuàng)建一個(gè)新的任務(wù)棧,這個(gè)時(shí)候待啟動(dòng)Activity實(shí)際上是以singleTask模式啟動(dòng)的。
singleTop棧頂復(fù)用模式
如果新Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會(huì)被重新創(chuàng)建,同時(shí)它的onNewIntent方法會(huì)被回調(diào),通過(guò)此方法的參數(shù)我們可以取出當(dāng)前請(qǐng)求的信息。這個(gè)Activity的onCreate、onStart不會(huì)被系統(tǒng)調(diào)用,因?yàn)樗麄儧](méi)有發(fā)生改變。如果新Activity的實(shí)例已經(jīng)存在但是不在棧頂,那么新Activity仍然會(huì)重新創(chuàng)建。
singleTask棧內(nèi)復(fù)用模式
只要Activity在一個(gè)棧中存在,那么多次啟動(dòng)此Activity都不會(huì)重新創(chuàng)建實(shí)例,系統(tǒng)會(huì)回調(diào)onNewIntent方法。當(dāng)一個(gè)具有singleTask模式的Activity請(qǐng)求啟動(dòng)后,系統(tǒng)會(huì)首先尋找此Activity所需要的任務(wù)棧,如果需要的任務(wù)棧不存在,就重新創(chuàng)建一個(gè)任務(wù)棧,然后創(chuàng)建Activity的實(shí)例后把Activity放入棧中;如果存在Activity所需要的任務(wù)棧,并且Activity的實(shí)例存在,則把Activity調(diào)到棧頂并調(diào)用onNewIntent方法,如果實(shí)例不存在,就創(chuàng)建Activity的實(shí)例并把Activity放入棧中。
- 例如目前任務(wù)棧S1中的情況為ADBC,這個(gè)時(shí)候Activity D以singleTask模式請(qǐng)求啟動(dòng),所需的任務(wù)棧為S1,根據(jù)站內(nèi)復(fù)用原則,D不會(huì)被重新創(chuàng)建,系統(tǒng)會(huì)把D切換到棧頂,并調(diào)用其
onNewIntent方法,同時(shí)由于singleTask默認(rèn)具有clearTop效果,會(huì)導(dǎo)致棧內(nèi)所有在D上面的Activity全部出棧,因此,S1中的情況為AD。
singleInstance單實(shí)例模式
為加強(qiáng)的singleTask模式,此種模式只能單獨(dú)的位于一個(gè)任務(wù)棧中
- Activity A是singleInstance模式,當(dāng)A啟動(dòng)后,系統(tǒng)會(huì)為它創(chuàng)建一個(gè)新的任務(wù)棧,然后A就在這個(gè)新的任務(wù)棧中,由于棧內(nèi)復(fù)用的特性,后續(xù)的請(qǐng)求均不會(huì)創(chuàng)建新的Activity,除非這個(gè)獨(dú)特的任務(wù)棧被系統(tǒng)銷(xiāo)毀。
給Activity指定啟動(dòng)模式
-
通過(guò)AndroidMenifest設(shè)置
android:launchMode="singleTask"
-
通過(guò)Intent中設(shè)置標(biāo)志位
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);-
FLAG_ACTIVITY_NEW_TASK
為Activity指定“singleTask”啟動(dòng)模式 -
FLAG_ACTIVITY_SINGLE_TOP
為Activity指定“singleTop”啟動(dòng)模式 -
FLAG_ACTIVITY_CLEAR_TOP
使用此標(biāo)記的Activity,當(dāng)它啟動(dòng)時(shí),在同一個(gè)任務(wù)棧中所有位于它上面的Activity都要出棧。此模式一般和FLAG_ACTIVITY_NEW_TASK 配合使用。 -
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
使用此標(biāo)記的Activity不會(huì)出現(xiàn)在歷史Activity的列表里,相當(dāng)于
android:excludeFromRecents="true" -
FLAG_ACTIVITY_NEW_TASK