1. standard
2. singleTop
3. singleTask
4. singleInstance
1. 使用
1. 在manifest中activiy標籤中設置launchMode
2. 代碼中使用intent啓動activity時指定flag,此方法與launchMode並不是一一對應的,並且優先級高於launchMode
2. 詳細說明
1. standard
默認與啓動的activity位於用一個task棧,忽略指定的棧名。除非啓動該activity的activity爲singleInstance模式。每次都會在棧頂創建一個activity實例
2. singleTop
默認與啓動的activity位於用一個task棧,忽略指定的棧名。除非啓動該activity的activity爲singleInstance模式。若棧頂恰好爲打開的activity實例,不創建新的實例,複用該棧頂實例,複用時會調用該activity的onNewIntent-Restart-Onstart-OnResume(不調用OnCreate)
3. singleTask
默認與啓動的activity位於用一個task棧,忽略指定的棧名。除非啓動該activity的activity爲singleInstance模式。若棧內存在與打開的activity相同的實例,不創建新的實例,複用該棧頂實例,並清除相同task棧內該實例上部所有實例,具有clear top效果。複用時會調用該activity的onNewIntent-Restart-Onstart-OnResume(不調用OnCreate)。注:啓動singleTask的activity時,若該singleTask的activiy指定了taskAffinity也就是Task棧名,系統會判斷該棧名與啓動的activiyt所在的棧名是否相同,如不同則新建該task棧用來存放該activiy
4. singleInstance
singleTask的升級版。必須單獨存在於一個task棧內,使用singleInstance的activityA打開其他非singleInstance的activityB時,由於兩個不能處於同一個task棧內,會使用activityB指定的task棧,未指定的話新建task棧存儲
3. android:taskAffinity用來指定默認棧名
android:launchMode="standard"
啓動方法
<
activityandroid:name=".launchmode.ActivityA"
android:taskAffinity="com.task.a1"
android:launchMode="standard"/>
4. activity的launchMode不是默認時,需要注意重寫activity的onNewIntent方法,否則複用activity時該activity無法重新獲得intent啓動數據:例如
@Override
protected void onNewIntent(Intent intent) {
Log.i("test","onNewIntent..."
);
setIntent(intent);
processExtraData();
super.onNewIntent(intent);
}
private void processExtraData(){
String value = getIntent().getStringExtra("test"
);
Log.i("test","value===>"+
value);
}
參考網址: