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