在項目開發(fā)過程中遇到的一個問題,現(xiàn)在將其記錄下來:
問題描述:
點擊App圖標啟動時声登,會由SplashActivity跳轉(zhuǎn)至MainActivity,相信大多數(shù)App都是這樣的吧。但是從最近任務(wù)列表點擊時直接白屏,大概3秒之后會直接顯示MainActivity娘摔,也就是說SplashActivity被跳過了(在這之前也已經(jīng)確認App被徹底關(guān)掉了),我需要的是點擊最近任務(wù)列表中的App時唤反,要先顯示SplashActivity凳寺,然后再跳轉(zhuǎn)到MainActivity。
解決方案:
經(jīng)過排查彤侍,發(fā)現(xiàn)AndroidManifest.xml中關(guān)于MainActivity的聲明是這樣的:
<activity
android:name="com.example.MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:screenOrientation="portrait" />
所以想到可能是因為launchMode設(shè)定導(dǎo)致的肠缨,將launchMode設(shè)置為默認值之后(直接將android:launchMode="singleTask"
刪掉),問題就得到了解決盏阶。
但是這樣會導(dǎo)致MainActivity在來回切換過程中生成多個實例晒奕,所以在跳轉(zhuǎn)到MainActivity時需要設(shè)置Intent的Flag:
// MainActivity.java
public static void startActivity(Activity activity) {
Intent intent = new Intent();
intent.setClass(activity, MainActivity.class);
/*
* Intent.FLAG_ACTIVITY_CLEAR_TOP
* 如果設(shè)置這個屬性,跳轉(zhuǎn)至該Activity時名斟,如果這個Activity已經(jīng)在當前的Task中運行脑慧,
* 那將會清除該Activity之上所有的Activity,并將該Activity置于棧頂砰盐;
*
* Intent.FLAG_ACTIVITY_SINGLE_TOP
* 如果不設(shè)置這個屬性闷袒,那跳轉(zhuǎn)至Activity時,將會執(zhí)行onCreate方法
* 設(shè)置這個屬性的話岩梳,跳轉(zhuǎn)至Activity時囊骤,將會執(zhí)行onNewIntent方法
*/
int flag = Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP;
intent.setFlags(flag);
activity.startActivity(intent);
}
上面這個方法只能用于MainActivity已經(jīng)在棧中存在時,如果棧中不存在MainActivity冀值,也就是剛運行時(由SplashActivity跳轉(zhuǎn)至MainActivity),這時就不需要設(shè)置flag, 直接跳轉(zhuǎn)即可。
至于Activity的四種啟動模式豹爹,網(wǎng)上有太多的講解了俺附,這里就不再闡述了。
總結(jié)一下四種模式:
standard 默認模式抵栈,每start一次就會創(chuàng)建一個實例(與Task無關(guān))
singleTop 跟standard模式很類似告材,但是當前實例如果在棧頂,就不會創(chuàng)建新的實例竭讳,會調(diào)用該實例的onNewIntent方法创葡;如不在棧頂,則創(chuàng)建新的實例(與Task無關(guān))
singleTask 如果該實例已經(jīng)存在于其他的Task中绢慢,則直接調(diào)用該Task中的實例灿渴,如果沒有的話,新建一個Task(只有一個Task中存在該實例)
singleInstance 新建一個Task胰舆,且在該Task中只能存在該Activity的實例(只有一個Task會有骚露,并且該Task中只有這個實例)