android 中,在使用Intent啟動(dòng)Activity時(shí),我們可以使用兩種方式對(duì)于Activity的啟動(dòng)模式進(jìn)行規(guī)定,最常用的是在manifest文件中聲明,Activity的啟動(dòng)模式分為四類:
activity啟動(dòng)之后會(huì)放入任務(wù)棧中,任務(wù)棧遵循后進(jìn)先出的原則,
1)standard? 標(biāo)準(zhǔn)模式,使用該啟動(dòng)模式時(shí),每次都會(huì)新創(chuàng)建activity實(shí)例,并加入到任務(wù)棧中,新創(chuàng)建的activity都置于棧頂。
2)singleTop? 模式,使用該啟動(dòng)模式時(shí),如果要啟動(dòng)的activity剛好位于棧頂,則不需要重新創(chuàng)建activity實(shí)例,會(huì)復(fù)用該棧頂實(shí)例,并且調(diào)用onNewIntent方法重啟該activity。
3)singleTask 模式,使用該啟動(dòng)模式時(shí),當(dāng)啟動(dòng)目標(biāo)activity時(shí),需要查看當(dāng)前任務(wù)棧中是否存在目標(biāo)Activity實(shí)例,如果存在,會(huì)將此Activity置于棧頂,原先在該activity上方的activity都會(huì)被移出任務(wù)棧。
4)singleInstance模式,使用該啟動(dòng)模式時(shí),當(dāng)啟動(dòng)目標(biāo)activity時(shí),查看目標(biāo)activity是否存在,如果不存在,則需要新創(chuàng)建一個(gè)任務(wù)棧,并將這個(gè)activity單獨(dú)放入這個(gè)棧中,如果目標(biāo)activity存在,則直接調(diào)用相應(yīng)任務(wù)棧中的相應(yīng)的activity。
了解了manifest中的啟動(dòng)模式規(guī)則,就不得不提到,如何在代碼中設(shè)置activity的啟動(dòng)模式。
代碼中設(shè)置啟動(dòng)模式的方法就是,通過(guò)給intent設(shè)置flag屬性,進(jìn)而達(dá)到控制啟動(dòng)模式的目的,下面了解一下幾種常見的flag,與他們?cè)诖a中的取值與說(shuō)明。
(1)Intent.FLAG_ACTIVITY_NEW_TASK? ? ? ?開啟一個(gè)新任務(wù),flags默認(rèn)該值,該值類似于lanchMode="standard",不同之處在于,如果原來(lái)不存在活動(dòng)棧, FLAG_ACTIVITY_NEW_TASK 就會(huì)創(chuàng)建一個(gè)新棧。
(2)Intent.FLAG_ACTIVITY_SINGLE_TOP? ? ? ?當(dāng)棧頂為待跳轉(zhuǎn)的activity實(shí)例時(shí),重用棧頂?shù)膶?shí)例,該值等同于lanchMode="singleTop"。
(3)Intent.FLAG_ACTIVITY_CLEAR_TOP? ? ? ? 當(dāng)棧中存在待跳轉(zhuǎn)的Activity實(shí)例時(shí),重新創(chuàng)建一個(gè)新實(shí)例,并將原實(shí)例上方的所有實(shí)例加以清除,該值與 lanchMode="singleTask" 類似,但是 lanchMode="singleTask" 采用onNewIntent啟用原任務(wù),而 FLAG_ACTIVITY_CLEAR_TOP? ? 采用先onDestroy再onCreate創(chuàng)建新任務(wù)。
(4)Intent.FLAG_ACTIVITY_NO_HISTORY? ? ? ? 該標(biāo)志與lanchMode="standard"類似,但是棧中不保存新啟動(dòng)的activity實(shí)例,這樣下次無(wú)論以何種方式再啟動(dòng)該實(shí)例,也要走standard完整流程。
(5)Intent.FLAG_ACTIVITY_CLEAR_TASK? ? ? ? 該標(biāo)志非常暴力,跳轉(zhuǎn)到新頁(yè)面時(shí),棧中的所有實(shí)例被清空,注意,該標(biāo)志需要結(jié)合 FLAG_ACTIVITY_NEW_TASK 使用,即setFlags的參數(shù)為 Intent.FLAG_ACTIVITY_CLEAR_TASK| Intent.FLAG_ACTIVITY_NEW_TASK 。