Activity生命週期和啓動模式 - Android開發藝術探索讀書筆記(第一章)


提要:終於有時間着手閱讀這本書啦,良心之作,必須好好研究下,於是決心做起讀書筆記,一些個人的見解,希望幫助到其他小白理解的同時自己也能堅持續更下去,堅持,難能可貴,一起加油啦~

 

第一章 - Activity生命週期和啓動模式

 

1.1 - 生命週期的全面分析

    重點 - 生命週期變化、異常結束與正常結束

 

1、回想這幾種情況,生命週期如何?

   onCreate 初始化、加載佈局資源、加載所需數據

   onStart 後臺可見,但看不到,不可交互

   onResume 前臺可見

   onPause  一般onStop會緊接着調用,極端情況,快速返回原本activity、,onStop就不掉用了,直接可以onResume

   onStop 不可見時候調用,返回時候onRestart、onStart、onResume- 可輕度回收資源

   onDestory 銷燬 - 最終回收資源



2、 第一次啓動然後正常結束(csr  psd)、----括號裏面偷懶用了簡寫(onCreate、onStart。。。)~

    打開新的activity或者home鍵返回桌面(ps csr)、、

    再次會到原activity(rsr psd)

   

3、onCreate與 onDestory配對

   onStart 與onStop配對(是否位於後臺的角度來調用)

   onResume 與onPause配對(是否位於前臺的角度來調用)

 

4、異常結束?

   onSaveInstanceState來保存當前狀態(onStop之前調用,與onPause比較就比較不確定)

   onRestoreInstanceState來恢復當前狀態(onStart之後調用)

 

5、阻止系統重新創建Activity。AndroidMenifest.xml裏Activity標籤加入configChanges屬性(例如android:configChanges = "orientation" 防止屏幕旋轉時候重新加載)

    P14 有該屬性各種項目和含義

    另(拓展):!設置了android:configChanges 屬性後,原本需要重新創建時候,會直接調用onCreate方法中的onConfigurationChanged方法,而不會重新執行onCreate方法

 

6、如果後臺工作不在四大組件而獨立運行與後臺,很容易被殺死。建議將後臺工作放入Service中保證進程有一定優先級

 

1.2 - Activity啓動模式

    重點 - 啓動模式、標誌位

 

1、四種啓動模式(AndroidMenifest裏面Activity屬性可設置 lanuchMode=“singleTask”)

 

   standard、 標準模式

    ①系統默認啓動模式

    ②不論存在與否,都會重新創建一個新的實例

    ③多實例實現,誰啓動了這個Activity、那麼這個Activity就運行在啓動它那個Activity所在棧

 

   singleTop、棧頂複用模式(運用:讓後臺運行的Activity回到前臺並傳遞一些數據)

    ①判斷需要啓動的Activity是否爲任務棧棧頂 ,如果是,則不會重新創建,如果不是,則會重新創建

    ②注意、不重新創建時候,該Activity的 onNewIntent(Intent intent) 方法會被回調,通過該方法的參數,可以取出當前請求的信息;

       第一次啓動時候:onCreate()---->onStart()---->onResume()

       再次啓動時候:onNewIntent()---->onResart()------>onStart()----->onResume()

    ③注意、系統可能會殺死該Activity,殺死之後,啓動情況與第一次啓動相同,所以有必要在onCreate與onNewIntent方法中調用同一個處理數據的方法

    另(拓展):!onNewIntent調用時機:

   http://www.cnblogs.com/zenfly/archive/2012/02/10/2345196.html

 

   singleTask、棧內複用模式 - 單實例模式?

    ①判斷Activity所需任務棧內是否已經存在,如果存在,就把該Activity切換到棧頂(會導致在它之上的都會出棧)

    ②如果所需任務棧都不存在,就會先創建任務棧再創建該Activity

    ③可以理解爲 頂置Activity+singleTop 的模式

       第一次模式:onCreate()---->onStart()---->onResume()

       再次啓動時候:頂置Activity後,onNewIntent()---->onResart()------>onStart()----->onResume()

   

   singleInstance、單實例模式 - 加強的singleTask模式

    ①擁有singleTask的所有特性之外,此模式Activity只能單獨地位於一個新的任務棧中

    ②也就是,Activity啓動之後,就會獨自在一個新的任務棧中,下次肯定不會重新創建該Activity,除非被系統殺死

       第一次模式:創建一個新棧併入棧、onCreate()---->onStart()---->onResume()

       再次啓動時候:onNewIntent()---->onResart()------>onStart()----->onResume()

   

2、Activity所需任務棧 - 與參數TaskAffinity(譯爲:任務相關性)

    ①該參數標識了一個Activity所需要的任務棧的名字(默認情況下,任務棧名字爲應用的包名),當然也可以爲每個Activity單獨指定TaskAffinity屬性。

    ②任務棧分爲:前臺任務棧、後臺任務棧(該棧內Activity位於暫停狀態,用戶可以通過切換將其調到前臺)

   

    注意兩種情況:

   ①TaskAffinity與singleTask啓動模式配對使用

       TaskAffinity是具有該模式的Activity的目前任務棧的名字,待啓動的Activity會運行在名字與TaskAffinity相同的任務棧

   ②TaskAffinity與allowTaskReparenting結合

       A應用中打開、B應用中的、Activity C ,那麼C會存在於A應用的任務棧中,此時Home返回桌面,點擊應用B,C會被轉移到B應用的任務棧中

       

3、兩種指定啓動模式的方式

   ①AndroidMenifest的activity標籤中 android:launchMode

   ②Intent中設置intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    區別:第②種方式優先級要高於第①種方式;

             第①種方式無法爲Activity設定FLAG_ACTIVITY_CLEAR_TOP,第②種方式無法爲Activity指定singleInstance



4、標記位Flags

    P27

    使用標記位時候,要注意有些標記位是系統內部使用的,應用程序不需要手動去設置這些標記位。

 

5、IntentFilter匹配規則

 

    顯式調用:

   Intent intent=new Intent(MainActivity.this, SecondActivity.class);

   startActivity(intent);

 

    隱式調用:

    需要添加過濾器intentfilter

   Intent intent=new Intent("com.example.android.tst.SecondActivity");

   startActivity(intent);

 

   activity標籤裏

   <intent-filter>標籤可以有多個,只要完全匹配其中一個就可以

   ①action(至少有一個) 必須和過濾規則中的其中一個相同 區分大小寫;

   ②category(可以沒有、可以多個)intent中可以不存在category,系統會默認加上一個android.intent.category.DEAFAULT,但如果存在就必須匹配其中一個;

   ③data()data由兩部分組成,mimeType(媒體類型)和URI,要求和action相似。如果沒有指定URI,URI但默認值爲content和file(schema);

 

 

 

 


發佈了20 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章