Android-Task和Activity相關的一些屬性[轉]

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

如果這個特性沒有被設定,設定到<application>元素上的allowTaskReparenting特性的值會應用到Activity上。默認值爲“false”。
一 般來說,當Activity啓動後,它就與啓動它的Task關聯,並且在那裏耗盡它的整個生命週期。噹噹前的Task不再顯示時,你可以使用這個特性來強 制Activity移動到有着affinity的Task中。典型用法是:把一個應用程序的Activity移到另一個應用程序的主Task中。
例 如,如果e-mail中包含一個web頁的鏈接,點擊它就會啓動一個Activity來顯示這個頁面。這個Activity是由Browser應用程序定 義的,但是,現在它作爲e-mail Task的一部分。如果它重新宿主到Browser Task裏,當Browser下一次進入到前臺時,它就能被看 見,並且,當e-mail 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不會重新宿主,但是會銷燬。
android:launchMode
用於指示Activity如何啓動。這裏有四種模式,與Intent對象中的Activity Flags(FLAG_ACTIVITY_*變量)共同作用,來決定Activity如何啓動來處理Intent。
它們是:
“standard”
“singleTop”
“singleTask”
“singleInstance”
默認模式是“standard”。
這 些模式可以分成兩大組別,“standard”和“singleTop”一組,“singleTask”和“singleInstance”一組。具 有 “standard”和“singleTop”啓動模式的Activity可以實例化很多次。這些實例可以屬於任何Task並且可以位於 Activity stack的任何位置。
典型的情況是,它們會進入調用startActivity()的Task(除非Intent對象包含 FLAG_ACTIVITY_NEW_TASK標誌,在這種情況下會選擇一個不同的Task——參考taskAffinity特性)。
相反的,“singleTask”和“singleInstance”只能啓動一個Task。對於“singleInstance”的Activity總是位於Activity stack的底部。對於“singleTask”的Activity,如果它的android:taskAffinity和啓動它的acitivity的android:taskAffinity不一樣它也總是位於Activity stack的底部。對於“singleTask”和“singleInstance”的Activity,設備一次只能擁有一個Activity的實例——只有一個這樣的Task。
“standard” 和“singleTop”模式只在一種情況下有差別:每次有一個新的啓動“standard”Activity的Intent,就會創建一個新的實例來響 應這個Intent。每個實例處理一個Intent。相似的,一個“singleTop”的Activity實例也有可能被創建來處理新的Intent。
然而,如果目標Task已經有一個存在的實例並且位於stack的頂部,那麼,這個實例就會接收到這個新的Intent(調用 onNewIntent());不會創建新的實例。
在其他情況下——例如,如果存在的“singleTop”的Activity實例在目標Task中,但不是在stack的頂部,或者它在一個stack的頂部,但不是在目標Task中——新的實例都會被創建並壓入stack中。
“singleTask”和“singleInstance”模式也只在兩種情況下有差別:“singleTask”Activity允許其它Activity成爲它的Task的部分。如果它的android:taskAffinity和啓動它的acitivity的android:taskAffinity不一樣,它 就總是位於Activity stack的底部,如果一樣,它就不是位於Activity stack的底部。另外,其它Activity(必須是 “standard”和“singleTop”Activity)可以啓動加入到“singleTask”Activity所在的Task中。
“singleInstance”Activity, 換句話說,不允許其它Activity成爲它的Task的部分。它是Task中的唯一Activity。如果它啓動其它的Activity,這個 Activity會被放置到另一個task中——好像Intent中包含了 FLAG_ACTIVITY_NEW_TASK標誌。
android:noHistory
用於標記當用戶從Activity上離開並且它在屏幕上不再可見時Activity是否從Activity stack中清除並結束(調用finish()方法)——“true”,表示它應該關閉,“false”,表示不需要。默認值是“false”。
“true”值意味着Activity不會留下歷史痕跡。因爲它不會在Activity stack的Task中保留,因此,用戶不能返回它。
注意1:該Activity會在用戶離開時,或在任務管理器再次選擇它時銷燬。
android:taskAffinity
Activity爲Task擁有的一個affinity。擁有相同的affinity的Activity理論上屬於相同的Task(在用戶的角度是相同的“應用程序”)。Task的affinity是由它的根Activity決定的。
affinity決定兩件事情——Activity重新宿主的Task(參考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK標誌啓動的Activity宿主的Task。
默認情況,一個應用程序中的所有Activity都擁有相同的affinity。也可以設定這個特性來重組它們,甚至可以把不同應用程序中定義的Activity放置到相同的Task中。
爲了明確Activity不宿主特定的Task,設定該特性爲空的字符串。
如 果這個特性沒有設置,Activity將從應用程序的設定那裏繼承下來(參考<application>元素的taskAffinity特 性)。應用程序默認的affinity的名字是<manifest>元素中設定的package名。
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。如果它的啓動模式聲明爲 “standard”(默認值),
並 且你沒有在這個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。
這種方式下,新的Activity可以調用setResult(int)或setResult (int resultCode, Intent data),並且這個結果值將發送給那個作爲答覆目標的Activity。
注意:感覺它和startActivityForResult的功能差不多,但是還是有疑惑。
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一般通過調用startActivity()啓動並加入到Task中。它同調用者一樣,進入同一個Task。
然而,如果傳遞給startActivity()的Intent對象中包含FLAG_ACTIVITY_NEW_TASK時,系統會搜索一個新的Task來容納新的Activity。
通常,如標誌的名字所示,是一個新的Task。然而,並不是必須是。如果已經存在一個Task與新Activity的affinity相同,這個Activity就會加入到那個Task中。如果不是,啓動一個新的Task。
如果啓動它的acitve和新Activity的affinity相同,那麼新Activity的會進入啓動它的acitve所在的Task.
FLAG_ACTIVITY_NO_ANIMATION
如果在Intent中設置,並傳遞給Context.startActivity()的話,這個標誌將阻止系統進入下一個Activity時應用 Acitivity遷移動畫。
這並不意味着動畫將永不運行——如果另一個Activity在啓動顯示之前,沒有指定這個標誌,那麼,動畫將被應用。
這個標誌可以很好的用於執行一連串的操作,而動畫被看作是更高一級的事件的驅動。
FLAG_ACTIVITY_NO_HISTORY
如果設置,新的Activity將不再歷史stack中保留。用戶一離開它,這個Activity就關閉了。這也可以通過設置noHistory特性。
注意1:該Activity會在用戶離開時,有時要直到離開後再回來時才銷燬。但是對於noHistory特性,在任務管理器再次選擇它時也會被銷燬。
FLAG_ACTIVITY_NO_USER_ACTION
如果設置,作爲新啓動的Activity進入前臺時,這個標誌將阻止現在在最前方的Activity因爲我們新的Activity要啓動而暫停時回調onUserLeaveHint()。
一個Activity可以依賴這個回調(onUserLeaveHint())指明是顯式的用戶動作引起的Activity移出後臺。
這個回調在Activity的生命週期中標記一個合適的點,並關閉一些Notification。
如果一個Activity是通過非用戶驅動的事件啓動,如來電或鬧鐘,啓動的,這個標誌也應該傳遞給Context.startActivity,
這樣保證暫停的Activity不認爲用戶已經知曉其Notification。
注意1:如果一個Activity通過非用戶驅動的事件,如來電或鬧鐘,啓動的,這個標誌也應該傳遞給Context.startActivity。
注意2:關於onUserLeaveHint的內容請參照附1.
FLAG_ACTIVITY_PREVIOUS_IS_TOP
If set and this intent is being used to launch a new activity from an existing one,
the current activity will not be counted as the top activity for deciding whether the new intent should be delivered to the top instead of starting a new one.
The previous activity will be used as the top, with the assumption being that the current activity will finish itself immediately.
注意1:不太明白
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標誌也設置的話,那麼這個標誌將被忽略。
注意1:不太明白
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
If set, and this activity is either being started in a new task or bringing to the top an existing task,
then it will be launched as the front door of the task. This will result in the application of any affinities needed to have that task in the proper state (either moving activities to or from it),
or simply resetting that task to its initial state if needed.
注意1:不太明白
FLAG_ACTIVITY_SINGLE_TOP
如果設置,當這個Activity位於歷史stack的頂端運行時,不再啓動一個新的。
附1
protected void onUserLeaveHint ()
Since: API Level 3
Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice.
For example, when the user presses the Home key, onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground,
onUserLeaveHint() will not be called on the activity being interrupted.
In cases when it is invoked, this method is called right before the activity’s onPause() callback.
This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently;
specifically, for helping activities determine the proper time to cancel a notfication.
作爲activity週期的一部分,它在activity因爲用戶要跳轉到別的activity而要退到background時使用。
比如,在用戶按下Home鍵(用戶的choice),它將被調用。比如有電話進來(不屬於用戶的choice),它就不會被調用。
那麼系統如何區分讓當前activity退到background時使用是用戶的choice?
它是根據促使當前activity退到background的那個新啓動的Activity的Intent裏是否有FLAG_ACTIVITY_NO_USER_ACTION來確定的
注意:通過調用finish()使該activity銷燬時不會調用該函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章