Activity的生命週期及啓動模式(開發藝術)

1、典型情況下的生命週期(指在有用戶參與的情況下,activity所經歷的生命週期的改變)

  

2、異常情況下的activity的生命週期(activity被系統回收或者由於當前的Configuration發生改變從而導致activity被銷燬重建)

  

onSaveInstanceState方法在onStop方法之前調用,onRestoreInstanceState方法在onStart方法之後調用。

    (1)、在AndroidMenifest.xml中指定configChanges屬性爲orientation|screenSize|keyboardHidden則橫豎屏切換時不在重新創建activity只是調用onConfigurationChanged這個方法【不調用生命週期中的方法】;當只設置orentation時橫豎屏切換隻會調用一次生命週期;當minsdkversion和targetsdkversion其中一個大於13screensize屬性起作用;當不設置時,切橫屏會執行一次生命週期的方法,切豎屏會執行兩次。

3、standard(標準啓動模式):Android的默認啓動模式。當啓動一個activity時都會創建一個新的activity的實例,不管這個實例是否存在。誰啓動了這個模式下的activity,那麼這個activity就運行在啓動它的那個activity所在的棧中【當單實例模式啓動它的時候這個activity沒在這個單實例模式所在的棧中,相當於待啓動的activity指定了FLAG_ACTIVITY_NEW_TASK標記位】。

4、singleTop(棧頂複用模式):如果啓動的activity已經位於棧頂了,則不會重新創建新的activity的實例,而是會回調這個activity的onNewIntent方法;如果啓動的activity不在棧頂,則會重新創建activity的實例【誰啓動了就在那個啓動的activity的任務棧中】。

5、singleTask(棧內複用模式):如果新啓動的activity已經在棧中存在,則不會重新創建新的activity的實例,而是會回調這個activity的onNewIntent方法;如果不存在,則會創建新activity的實例。

  • Android5.0之後A -> B(singleTask) -> C(startActivityForResult) -> B(新創建的);Android5.0之前A -> B(singleTask) -> C(startActivityForResult) -> B(不會顯示,直接跳到C的onResult方法中)
  • 在activityA啓動activityB時,發現activityB啓動模式爲singleTask,那麼設定他的啓動標誌爲FLAG_ACTIVITY_NEW_TASK
  • 然後獲得activityB的taskAffinity,如果沒有設置默認爲包名
  • 檢查是否已經存在一個affinity的任務,如果不存在創建一個任務棧
  • 既然已經存在這個任務,就檢索在這個任務中是否存在一個activityB的實例
  •  如果存在activityB實例,調用它的onNewIntent方法調到棧頂彈出它上面的實例;如果不存在,創建它的實例並壓入棧中

6、singleInstance(單實例模式):它除了有singleTask模式的所有特性外,還加強了一點,這個模式的activity只能單獨地位於一個任務棧中【activityA爲單例模式,activityB爲標準模式或者棧頂複用模式,activityC爲除單例模式之外的其它模式,其餘默認,A -> B -> C -> A -> B顯示的是C,解決方法是在B中添加taskAffinity這個屬性】。

(1)、回調onNewIntent方法時,當用戶操作的activity爲A,再次打開activityA時,此時調用onPause、onNewIntent、onResume方法;當用戶操作的activity爲B,再次打開activityA(在棧頂或者爲singleTask),此時調用onNewIntent、onRestart、onStart、onResume。

(2)、TaskAffinity(任務相關性):這個參數標識了一個activity所需要的任務棧的名字,默認情況下,所有activity所需的任務棧的名字爲應用程序的包名。這個屬性主要和singleTask啓動模式或者allowTaskReparenting屬性(沒測試過,不太清楚)配對使用,在其他情況下沒意義。

(3)、兩種方法指定啓動模式,一種是在AndroidMenifest.xml中爲activity指定launchMode屬性;另一種是在啓動新的activity時調用addFlags方法,給這個方法傳遞參數。首先,第二種方式優先級高於第一種,當並存時以第二種爲準;其次,兩種方式在限定範圍上有所不同,第一種無法直接爲activity設定FLAG_ACTIVITY_CLEAR_TOP標識,第二種方式無法爲activity指定singleInstance模式。

(4)、啓動標誌

  • FLAGE_ACTIVITY_NEW_TASK:爲activity指定singleTask啓動模式
  • FLAGE_ACTIVITY_SINGLE_TOP:爲activity指定singleTop啓動模式
  • FLAG_ACTIVITY_CLEAR_TOP:當啓動具有此標記位的activity時,在同一個任務棧中位於它上面的activity都要出棧
  • FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS:具有這個標記的activity不會出現在歷史activity的列表中

Android中activity四種啓動模式和taskaffinity詳解

7、action類別:一個字符串,區分大小寫。action的匹配要求Intent中的action存在且必須和過濾規則中的其中一個action相同【如果要是隱式啓動必須要至少有一個action】。

8、category類別:一個字符串,區分大小寫。intent中如果出現了category,不管有幾個category,必須是過濾規則中已經定義了的;也可以沒有,系統會默認intent加上android.intent.category.DEFAULT,這個時候過濾規則中必須有這個規則【過濾規則中有幾個必須匹配幾個】。

9、data類別:有兩部分組成,mimeType和URI。當沒有指定URI的時候,默認的爲file和content。

(1)mimeType:可以表示圖片、文本、視頻等不同的媒體格式【image/jpeg...】。

(2)URI<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]:scheme,URI模式,比如http、file等,如果URI中沒有指定scheme,那麼整個URI的其他參數無效,這也意味着URI是無效的;Host,URI的主機名,比如www.baidu.com,如果URI中沒有指定Host,那麼整個URI的其他參數無效,這也意味着URI是無效的;Port,URI中的端口號,比如80,僅當URI中指定了scheme和host參數的時候port參數纔有意義;Path、pathPattern和pathPrefix,這三個參數表示路徑信息,其中path表示完整的路徑信息,pathPattern也表示完整的路徑信息,但是他裏面可以包含通配符“*”,“*”表示0個或多個任意字符,pathPrefix表示路徑的前綴信息。

感謝《Android開發藝術探索》。

 

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