每一個activity都有一個taskAffinity,具備相同taskAffinity的activity能夠被看作是同一個task.activity的taskAffinity是有他的root Activity決定的。taskAffinity 決定了activity將要從新加入的的那個task是哪一個。html
前面說了,具備相同taskAffinity的能夠被看作是同一個task。java
當經過
啓動一個activity時,該task將具備相同taskAffinity的activity彙集起來,同屬一個任務。默認狀況下,因此activity的taskAffinity,是相同的,即應用程序的包名,你也能夠經過設置不一樣的taskAffinity,來將activity分配到不一樣的task中。注經過FLAG_ACTIVITY_NEW_TASK
啓動的任務,若點擊home,回到主界面,點擊查看後臺任務按鈕,能夠看到該應用有兩個後臺任務,另外一個即你FLAG_ACTIVITY_NEW_TASK
啓動的那個。androidFLAG_ACTIVITY_NEW_TASK
taskAffinity名字不易過短,過短運行會提示錯誤。app
想像這樣一個場景,application 1和2,application1中一個MainActivity,其配置以下
spa
<activity
android:allowTaskReparenting="true"
android:name=".MainActivity"
android:taskAffinity="com.test"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
code
application2裏面有一個MainActivity.java和TestActivity.java,TestActivity1.java配置以下:htm
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:taskAffinity="com.test"
android:name=".TestActivity"
android:label="@string/title_activity_test" >
get
先啓動app1,而後按home鍵,app1到了後臺當中,而後啓動app2,app2中MainActivity->TestActivity.java->TestActivity1.java,而後按返回鍵,按理應該是TestActivity1.java->TestActivity.java->MainActivity.java,可咱們會看到這樣TestActivity1.java->TestActivity.java->MainActivity.java(app1的)->MainActivity.java,這是由於app1的MainActivity的taskAffinity和app2的TestActivity和TestActivity1的相同,能夠認爲屬於同一任務,因此當app1回到後臺時 ,當再次有相同任務啓動時,其就會被該任務所收留,因此就出現的這種現象,注意app1的MainActivity的 android:allowTaskReparenting="true"屬性要設置爲true,去掉無此效果。android:allowTaskReparenting代表activity是否被容許從task中移除,加入到和他有相同taskAffinity標誌的task中去,當有相同taskAffinity的task被bring to front時。string
或者這樣啓動程序,先啓動APP2,MainActivity->TestActivity.java->TestActivity1.java,進入TestActivity1,按home鍵將其置於後臺,在啓動app1,此時奇怪的事情發生了,你不會看到app1的MainActivity,你看到的仍然是app2處於最頂端的TestActivity1的頁面。it
當app2按MainActivity->TestActivity.java->TestActivity1.java順序跳到TestActivity1時,在TestActivity1裏面執行finishAffinity();會finish掉當前的TestActivity1.java和同處於一個Task的TestActivity.java。顯示出MainActivity的界面。
謹此記錄。