【Android】Affinity以及Manifest中Activity的屬性值介紹

什麼是Affinity

       在某些情況下,Android需要知道一個Activity屬於哪個Task,即使它沒有被啓動到一個具體的Task裏。這是通過任務共用性(Affinities)完成的。任務共用性(Affinities)爲這個運行一個或多個Activity的Task提供了一個獨特的靜態名稱,默認的一個活動的任務共用性(Affinity)是實現了該Activity的.apk包的名字。

       當開始一個沒有Intent.FLAG_ACTIVITY_NEW_TASK標誌的Activity時,任務共用性affinities不會影響將會運行該新活動的Task:它總是運行在啓動它的Task裏。但是,如果使用了NEW_TASK標誌,那麼共用性(affinity)將被用來判斷是否已經存在一個有相同共用性(affinity)的Task。如果是這樣,這項Task將被切換到前面而新的Activity會啓動於這個Task的頂層。

       這種特性在您必須使用NEW_TASK標誌的情況下最有用,尤其是從狀態欄通知或桌面快捷方式啓動活動時。結果是,當用戶用這種方式啓動您的應用程序時,它的當前Task將被切換到前臺,而且想要查看的Activity被放在最上面。

       你可以在程序清單(Manifest)文件的應用程序application標籤中爲.apk包中所有的活動分配你自己的任務共用性Affinites,或者在活動標記中爲各個活動進行分配。

       一些說明其如何使用的例子如下:


  • 如果您的.apk包含多個用戶可以啓動的高層應用程序,那麼您可能需要對用戶看到的每個Activity(活動)指定不同的affinities。一個不錯的命名慣例是以附加一個以冒號分隔的字符串來擴展您的.apk包名。例如,“ com.android.contacts ”.apk可以有affinities:“com.android.contacts:Dialer”和“ com.android.contacts:ContactsList”。
  • 如果您正在替換一個通知,快捷方式,或其他可以從外部發起的應用程序的“內部”活動,你可能需要明確設定您替代活動的taskAffinity和您準備替代的應用程序一樣。例如,如果您想替換contacts詳細信息視圖(用戶可以創建並調用快捷方式),你得把taskAffinity設置成“com.android.contacts”。


        跟 Task 有關的 manifest文件中Activity的特性值介紹

        android:allowTaskReparenting 
        用來標記Activity能否從啓動的Task移動到有着affinity的Task(當這個Task進入到前臺時)
       “true”,表示能移動,“false”,表示它必須呆在啓動時呆在的那個Task裏。

       如果這個特性沒有被設定,設定到<application>元素上的allowTaskReparenting特性的值會應用到Activity上。默認值爲“false”。
       一般來說,當Activity啓動後,它就與啓動它的Task關聯,並且在那裏耗盡它的整個生命週期。噹噹前的Task不再顯示時,你可以使用這個特性來強制Activity移動到有着affinity的Task中。典型用法是:把一個應用程序的Activity移到另一個應用程序的主Task中。 
       例如,如果 email中包含一個web頁的鏈接,點擊它就會啓動一個Activity來顯示這個頁面。這個Activity是由Browser應用程序定義的,但是,現在它作爲email Task的一部分。如果它重新宿主到Browser Task裏,當Browser下一次進入到前臺時,它就能被看見,並且,當email Task再次進入前臺時,就看不到它了。 
       Actvity的affinity是由taskAffinity特性定義的。Task的affinity是通過讀取根Activity的affinity決定。因此,根Activity總是位於相同affinity的Task裏。由於啓動模式爲“singleTask”和“singleInstance”的Activity只能位於Task的底部,因此,重新宿主只能限於“standard”和“singleTop”模式。

       android:alwaysRetainTaskState

       用來標記Activity所在的Task的狀態是否總是由系統來保持。
      “true”,表示總是;“false”,表示在某種情形下允許系統恢復Task到它的初始化狀態。默認值是“false”。
       這個特性只針對Task的根Activity有意義;對其它Activity來說,忽略之。 
       一般來說,特定的情形如當用戶從主畫面重新選擇這個Task時,系統會對這個Task進行清理(從stack中刪除位於根Activity之上的所有Activivity)。典型的情況,當用戶有一段時間沒有訪問這個Task時也會這麼做,例如30分鐘。 
       然而,當這個特性設爲“true”時,用戶總是能回到這個Task的最新狀態,無論他們是如何啓動的。這非常有用,例如,像Browser應用程序,這裏有很多的狀態(例如多個打開的Tab),用戶不想丟失這些狀態。

       android:clearTaskOnLaunch

       用來標記是否從Task中清除所有的Activity,除了根Activity外(每當從主畫面重新啓動時)
      “true”,表示總是清除至它的根Activity,“false”表示不。默認值是“false”。
        這個特性只對啓動一個新的Task的Activity(根Activity)有意義;對Task中其它的Activity忽略。 
        當這個值爲“true”,每次用戶重新啓動這個Task時,都會進入到它的根Activity中,不管這個Task最後在做些什麼,也不管用戶是使用BACK還是HOME離開的。當這個值爲“false”時,可能會在一些情形下(參考alwaysRetainTaskState特性)清除Task的Activity,但不總是。

       假設,某人從主畫面啓動了Activity P,並從那裏遷移至Activity Q。接下來用戶按下HOME,然後返回Activity P。一般,用戶可能見到的是Activity Q,因爲它是P的Task中最後工作的內容。然而,如果P設定這個特性爲“true”,當用戶按下HOME並使這個Task再次進入前臺時,其上的所有的Activity(在這裏是Q)都將被清除。因此,當返回到這個Task時,用戶只能看到P。

       如果這個特性和allowTaskReparenting都設定爲“true”,那些能重新宿主的Activity會移動到共享affinity的Task中;剩下的Activity都將被拋棄,如上所述。 

       android:finishOnTaskLaunch 
    
       用來標記當用戶再次啓動它的Task(在主畫面選擇這個Task)時已經存在的Activity實例是否要關閉(結束)
     “true”,表示應該關閉,“false”表示不關閉。默認值是“false”。 
       如果這個特性和allowTaskReparenting都設定爲“true”,這個特性勝出。Activity的affinity忽略。這個Activity不會重新宿主,但是會銷燬。 

 跟 Task 有關的 Intent對象中設置的Flag

       FLAG_ACTIVITY_BROUGHT_TO_FRONT 

       這個標誌一般不是由程序代碼設置的,如在launchMode中設置singleTask模式時系統幫你設定。 

       FLAG_ACTIVITY_CLEAR_TOP 

       如果設置,並且這個Activity已經在當前的Task中運行,因此,不再是重新啓動一個這個Activity的實例,而是在這個Activity上方的所有Activity都將關閉,然後這個Intent會作爲一個新的Intent投遞到老的Activity(現在位於頂端)中。 
       例如,假設一個Task中包含這些Activity:A,B,C,D。如果D調用了startActivity(),並且包含一個指向Activity B的Intent,那麼,C和D都將結束,然後B接收到這個Intent,因此,目前stack的狀況是:A,B。 
       上例中正在運行的Activity B既可以在onNewIntent()中接收到這個新的Intent,也可以把自己關閉然後重新啓動來接收這個Intent。如果它的啓動模式聲明爲“multiple”(默認值),並且你沒有在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標誌,那麼它將關閉然後重新創建;對於其它的啓動模式,或者在這個Intent中設置FLAG_ACTIVITY_SINGLE_TOP標誌,都將把這個Intent投遞到當前這個實例的onNewIntent()中。 
       這個啓動模式還可以與FLAG_ACTIVITY_NEW_TASK結合起來使用:用於啓動一個Task中的根Activity,它會把那個Task中任何運行的實例帶入前臺,然後清除它直到根Activity。這非常有用,例如,當從Notification Manager處啓動一個Activity。

       FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET

       如果設置,這將在Task的Activity stack中設置一個還原點,當Task恢復時,需要清理Activity。也就是說,下一次Task帶着FLAG_ACTIVITY_RESET_TASK_IF_NEEDED標記進入前臺時(典型的操作是用戶在主畫面重啓它),這個Activity和它之上的都將關閉,以至於用戶不能再返回到它們,但是可以回到之前的Activity。 
       這在你的程序有分割點的時候很有用。例如,一個e-mail應用程序可能有一個操作是查看一個附件,需要啓動圖片瀏覽Activity來顯示。這個Activity應該作爲e-mail應用程序Task的一部分,因爲這是用戶在這個Task中觸發的操作。然而,當用戶離開這個Task,然後從主畫面選擇e-mail app,我們可能希望回到查看的會話中,但不是查看圖片附件,因爲這讓人困惑。通過在啓動圖片瀏覽時設定這個標誌,瀏覽及其它啓動的Activity在下次用戶返回到mail程序時都將全部清除。

       FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

       如果設置,新的Activity不會在最近啓動的Activity的列表中保存。

       FLAG_ACTIVITY_FORWARD_RESULT

       如果設置,並且這個Intent用於從一個存在的Activity啓動一個新的Activity,那麼,這個作爲答覆目標的Activity將會傳到這個新的Activity中。這種方式下,新的Activity可以調用setResult(int),並且這個結果值將發送給那個作爲答覆目標的Activity。

       FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

       這個標誌一般不由應用程序代碼設置,如果這個Activity是從歷史記錄裏啓動的(常按HOME鍵),那麼,系統會幫你設定。

       FLAG_ACTIVITY_MULTIPLE_TASK

       不要使用這個標誌,除非你自己實現了應用程序啓動器。與FLAG_ACTIVITY_NEW_TASK結合起來使用,可以禁用把已存的Task送入前臺的行爲。當設置時,新的Task總是會啓動來處理Intent,而不管這是是否已經有一個Task可以處理相同的事情。 
       由於默認的系統不包含圖形Task管理功能,因此,你不應該使用這個標誌,除非你提供給用戶一種方式可以返回到已經啓動的Task。 
       如果FLAG_ACTIVITY_NEW_TASK標誌沒有設置,這個標誌被忽略。

       FLAG_ACTIVITY_NEW_TASK

       如果設置,這個Activity會成爲歷史stack中一個新Task的開始。一個Task(從啓動它的Activity到下一個Task中的Activity)定義了用戶可以遷移的Activity原子組。Task可以移動到前臺和後臺;在某個特定Task中的所有Activity總是保持相同的次序。 
       這個標誌一般用於呈現“啓動”類型的行爲:它們提供用戶一系列可以單獨完成的事情,與啓動它們的Activity完全無關。 
       使用這個標誌,如果正在啓動的Activity的Task已經在運行的話,那麼,新的Activity將不會啓動;代替的,當前Task會簡單的移入前臺。參考FLAG_ACTIVITY_MULTIPLE_TASK標誌,可以禁用這一行爲。 
       這個標誌不能用於調用方對已經啓動的Activity請求結果。

        FLAG_ACTIVITY_NO_ANIMATION

        如果在Intent中設置,並傳遞給Context.startActivity()的話,這個標誌將阻止系統進入下一個Activity時應用Acitivity遷移動畫。這並不意味着動畫將永不運行——如果另一個Activity在啓動顯示之前,沒有指定這個標誌,那麼,動畫將被應用。這個標誌可以很好的用於執行一連串的操作,而動畫被看作是更高一級的事件的驅動。

       FLAG_ACTIVITY_NO_HISTORY

       如果設置,新的Activity將不再歷史stack中保留。用戶一離開它,這個Activity就關閉了。這也可以通過設置noHistory特性。

       FLAG_ACTIVITY_NO_USER_ACTION 

       如果設置,作爲新啓動的Activity進入前臺時,這個標誌將在Activity暫停之前阻止從最前方的Activity回調的onUserLeaveHint()。 
       典型的,一個Activity可以依賴這個回調指明顯式的用戶動作引起的Activity移出後臺。這個回調在Activity的生命週期中標記一個合適的點,並關閉一些Notification。 
       如果一個Activity通過非用戶驅動的事件,如來電或鬧鐘,啓動的,這個標誌也應該傳遞給Context.startActivity,保證暫停的Activity不認爲用戶已經知曉其Notification。 

        FLAG_ACTIVITY_REORDER_TO_FRONT

       如果在Intent中設置,並傳遞給Context.startActivity(),這個標誌將引發已經運行的Activity移動到歷史stack的頂端。 
       例如,假設一個Task由四個Activity組成:A,B,C,D。如果D調用startActivity()來啓動Activity B,那麼,B會移動到歷史stack的頂端,現在的次序變成A,C,D,B。如果FLAG_ACTIVITY_CLEAR_TOP標誌也設置的話,那麼這個標誌將被忽略。 

       FLAG_ACTIVITY_SINGLE_TOP

       如果設置,當這個Activity位於歷史stack的頂端運行時,不再啓動一個新的。


原文出處:http://www.cnblogs.com/appzhang/archive/2012/08/25/2655696.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章