android:taskAffinity使用記錄

每一個activity都有一個taskAffinity,具備相同taskAffinity的activity能夠被看作是同一個task.activity的taskAffinity是有他的root Activity決定的。taskAffinity 決定了activity將要從新加入的的那個task是哪一個。html

     前面說了,具備相同taskAffinity的能夠被看作是同一個task。java

當經過FLAG_ACTIVITY_NEW_TASK 啓動一個activity時,該task將具備相同taskAffinity的activity彙集起來,同屬一個任務。默認狀況下,因此activity的taskAffinity,是相同的,即應用程序的包名,你也能夠經過設置不一樣的taskAffinity,來將activity分配到不一樣的task中。注經過FLAG_ACTIVITY_NEW_TASK 啓動的任務,若點擊home,回到主界面,點擊查看後臺任務按鈕,能夠看到該應用有兩個後臺任務,另外一個即你FLAG_ACTIVITY_NEW_TASK 啓動的那個。android

 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的界面。

謹此記錄。

相關文章
相關標籤/搜索