Activity的啓動模式包含四中:standard、singleTop、singleTask、singleInstance四中啓動模式,可在清單文件中做如下配置:
<span style="font-size:18px;"><activity android:name="MainActivity"
android:label="@string/app_name"
android:launchMode="singleTask"
android:taskAffinity="com.henry.it.test">
</activity></span>
首先taskAffinity是決定Activity的task分配的唯一標準,也就是說,新啓動的Activity是否在原任務棧中,由taskAffinity的值決定,其要點如下:
a)所有Act都有一個taskAffinity,如未明確指定,則默認該Act的吸附值與其所在application的吸附值相同
b)application一定有一個taskAffinity,如果爲明確指定,則默認使用該程序的主包名作爲吸附值
c)每個task一定有一個taskAffinity,該值取其Act棧的棧底Activity的吸附值
介紹完TaskAffinity的基本知識,再來講四中啓動模式特點:
1、standard:標準模式,也是默認模式
a)每次啓動Act,都會創建該Act的新實例
b)每個新創建的Act實例默認都創建於啓動它的Act所在的task
c)每個act可以同時存在多個實例,這些實例可以分佈在同一個Task中,也可以分佈在不同的Task中
2、singleTop
a)當具有singleTop屬性的Act的實例不位於啓動它的棧的棧頂時,其表現與standard模式相同
b)當具有singleTop屬性的Act的實例位於啓動它的棧的棧頂時,則不會創建該Act的新實例,而是調用棧頂Act的實例的onNewIntent()方法,將新intent傳入該實例
3、singleTask
a)具有singleTask屬性的Act局有全局唯一性,在整個Android系統內,該Act在同一時刻只能存在一個實例
b)當啓動具有singleTask屬性的Act時,如果該Act實例上不存在則直接創建新實例,否則,直接將已存在的該Act實例以上的實例全部銷燬,以使得該Act的實例重新處於棧頂位置,並調用onNewintent()方法將新的intent傳入該實例中
c)在創建具有singleTask屬性的Act時,如果該Act的TaskAffinity值與當前task的affinity值相同,則直接在當前task中創建,否則在新的task中創建
4、singleInstance
a)具有singleInstance屬性的Act局有全局唯一性,在整個Android系統內,該Act在同一時刻只能存在一個實例
b)當啓動局有singleInstance屬性的Act時,如果該Act實例上不存在則直接創建新實例,且總是在一個新的Task中創建(不考慮吸附值);如果該Act的實例已存在,則直接顯示已存在的實例
c)該使用局有singleInstance屬性的Act的實例啓動其他Act的實例時,如果被創建的Act的吸附值與已存在的某個task的吸附值相同,則在該task中創建,否則,在新的task中創建實例。
5、Intent的Flag屬性,旗標與啓動模式
a) FLAG_ACTIVITY_BROUGHT_TO_FRONT 若棧中已有A B C D四個Act且B是用該旗標啓動的,那麼再次啓動B將會使棧中的Act的順序變爲 A C D B;
b)FLAG_ACTIVITY_CLEAR_TOP 相當於啓動模式中的singleTask
c)FLAG_ACTIVITY_NEW_TASK 默認旗標
d)FLAG_ACTIVITY_NO_ANIMATION 不使用過渡動畫的旗標
e)FLAG_ACTIVITY_NO_HISTORY 該旗標控制被啓動的Act不會保留在棧中,例如棧中已有A B兩個Act,在B中以該Flag啓動C,再在C中啓動D,此時棧中只有A B D,沒有C;
f) FLAG_ACTIVITY_RECORDER_TO_FRONT 若棧中已有A B C D四個Act,那麼在D中以該Flag啓動B將會使棧中的Act的順序變爲 A C D B,注意與FLAG_ACTIVITY_BROUGHT_TO_FRONT的區別;
g)FLAG_ACTIVITY_SINGLE_TOP 相當於啓動模式中的singleTop