Activity的LaunchMode
一、LaunchMode簡介
默認情況下,當(dāng)我們多次啟動同一個Activity時,系統(tǒng)會創(chuàng)建多個實例并把它們一一放入任務(wù)棧中,當(dāng)我們單機back鍵,會發(fā)現(xiàn)這些Activity會一一回退,直到??諡橹梗?dāng)棧中無任何Activity時,系統(tǒng)就會回收這個任務(wù)棧。任務(wù)棧是一種”先進后出”的棧結(jié)構(gòu)。所以為了避免多次啟動同個Activity,系統(tǒng)重復(fù)創(chuàng)建多個實例的情況發(fā)生,Android提供了四種啟動模式來修改系統(tǒng)的默認行為。
standard(標(biāo)準(zhǔn)啟動模式)
這是系統(tǒng)默認的啟動模式。無論此實例是否存在,每次啟動一個Activity就會新創(chuàng)建一個新的實例,被創(chuàng)建的Activity生命周期正常。
singleTop(棧頂復(fù)用模式)
這種情況下,如果新的Activity已位于任務(wù)棧的棧頂,則次Activity不會被重新創(chuàng)建,同時它的onNewIntent方法會被回調(diào),通過此方法的參數(shù)我們可以取出當(dāng)前請求的信息。此時這個Activity的onCreate、onStart方法不會被調(diào)用。
singleTask(棧內(nèi)復(fù)用模式)
是一種單實例模式,當(dāng)一個具有singleTask模式的Activity請求啟動時,只要此Activity存在于任意一個任務(wù)棧中,多次啟動此Activity不會重新創(chuàng)建實例,系統(tǒng)會回調(diào)onNewIntent方法。具體來說,如果此Activity不存在于它想要的任務(wù)棧,系統(tǒng)會重新創(chuàng)建一個任務(wù)棧,然后創(chuàng)建此Activity的實例并放入棧內(nèi);當(dāng)此Activity存在于它想要的任務(wù)棧,這時要看此Activity是否在棧中存在實例,如果有實例存在,系統(tǒng)會把Activity調(diào)到棧頂并調(diào)用onNewIntent方法,如果實例不存在,就創(chuàng)建Activity實例并壓入棧中。
*特別的,設(shè)置singleTask模式的Activity需要存在的棧,要在AndroidManifest內(nèi)設(shè)置taskAffinity屬性,具體代碼如下。
<activity android:name=".MainActivity" android:launchMode="singleTask" android:taskAffinity="com.ryg.task1"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
singleInstance(單實例模式)
這是一種加強版singleTask模式,特別的此種模式的Activity只能單獨位于一個任務(wù)棧中。具體來說,當(dāng)啟動一個此模式的Activity,系統(tǒng)會為它創(chuàng)建一個新的任務(wù)棧,然后使此Activity堵在在這個新任務(wù)棧內(nèi)。后續(xù)如果再請求啟動此Activity,除非這個獨特的任務(wù)棧被系統(tǒng)銷毀,則均不會創(chuàng)建新的Activity。
二、設(shè)置啟動模式的方法
有兩種方法,第一是通過AndroidManifest來設(shè)置,具體代碼如下。
<activity android:name=".MainActivity" android:launchMode="singleTask"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
另一種是通過在Intent中設(shè)置標(biāo)志位來設(shè)置,具體代碼如下。
Intent intent=new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
優(yōu)先級上,第二種方式高于第一種。