這本書的信息量還是挺大的框仔,里面有很多很有用的細小的知識點,但是比較零碎拄养,所以我準備花點時間整理一下离斩,有些章節(jié)的知識點比較整體化我就直接跳過了,著重把細碎的知識點整理出來瘪匿。
第一章 Activity的生命周期和啟動模式
1.1 Activity的生命周期全面分析
1.onStart和onResume跛梗、onPause和onStop從描述上來看差不多,對我們來說有什么實質(zhì)的不同呢棋弥?
答:這兩個匹配(onStart-onStop,onResume-onPause)的回調(diào)分別表示不同的含義核偿,onStart、onStop是從Activity是否可見這個角度來回調(diào)的(比如切換到桌面或者打開新的Activity);onResume和onPause是從Activity是否位于前臺這個角度來回調(diào)的(打開了一個透明主題的Activity)嘁锯,除此以外并無其他明顯區(qū)別宪祥。
2.異常情況下的生命周期分析。
資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重新創(chuàng)建家乘,典型情況就是橫屏豎屏手機會拿到兩張不同的圖片(設(shè)定了landscape或者portrait狀態(tài)下的圖片)蝗羊。生命周期如下:
Activity->onSaveInstanceState(用來保存當(dāng)前Activity的狀態(tài),調(diào)用在onStop之前仁锯,和onPause沒有固定的時間先后順序)->...->onDestory->重建Activity->onCreate->onStart->onRestoreInstanceState耀找,數(shù)據(jù)保存是一種典型的委托思想,上層委托下層业崖,父容器委托子元素去處理一件事情野芒。
系統(tǒng)只會在Activity即將被銷毀并且有機會重新顯示的情況下才有機會去調(diào)用它。資源內(nèi)存不足導(dǎo)致優(yōu)先級低的Activity被殺死双炕。(該數(shù)據(jù)存儲和恢復(fù)過程和上面一種情況完全一致)優(yōu)先級順序如下:
前臺Activity(正在和用戶交互)>可見但非前臺Activity(比如彈出一個dialog)>后臺Activity(比如已被stop,通常在手機內(nèi)存不足時我們常手動滑動刪除的就是這種Activity)
可以通過配置Activity的configChanges屬性來使得配置發(fā)生改變后Activity不被重新創(chuàng)建狞悲。
android:configChanges = "orientation|screenSize"
1.2 Activity的啟動模式
1.當(dāng)我們用ApplicationContext去啟動standard模式的Activity會報錯,原因是因為standard模式的Activity默認會進入啟動它的Activity所屬的任務(wù)棧中妇斤,但是由于非Activity類型的Context并沒有所謂的任務(wù)棧所以會出現(xiàn)問題摇锋,解決方法如下:
為待啟動Activity指定FLAG_ACTIVITY_NEW_TASK標記位丹拯,這樣啟動的時候就會為它創(chuàng)建一個新的任務(wù)棧,這個時候啟動Activity實際上是以singleTask模式(棧內(nèi)復(fù)用模式)啟動的荸恕。
2.singleTop乖酬,當(dāng)新Activity已經(jīng)位于任務(wù)棧的棧頂,那么此Activity不會被重新常見融求,同時它的onNewIntent方法會被回調(diào)咬像。需要注意,這個Activity的onCreate生宛、onStart不會被系統(tǒng)調(diào)用县昂,因為它并沒有發(fā)生改變。
3.singleTask,當(dāng)一個具有singleTask模式的Activity請求啟動后茅糜,比如Activity A七芭,系統(tǒng)首先會尋找是否存在A想要的任務(wù)棧。
- 如果不存在就重新創(chuàng)建一個任務(wù)棧蔑赘,然后創(chuàng)建A的實例后把A放到棧中狸驳。
- 如果存在A所需的任務(wù)棧。再看A是否在棧中有實例存在:
- 如果有實例存在缩赛,系統(tǒng)就會把A調(diào)到棧頂并調(diào)用它的onNewIntent方法耙箍。
- 如果實例不存在,就創(chuàng)建A的實例并把A壓入棧中酥馍。
4.singleInstance:單實例模式辩昆,一種加強的singleTask模式,此模式下的Activity只能單獨地位于一個任務(wù)棧中旨袒。
5.TaskAffinity:任務(wù)相關(guān)性汁针。這個參數(shù)標識了一個Activity所需要的任務(wù)棧的名字,默認情況下砚尽,所有Activity所需要的任務(wù)棧的名字為應(yīng)用的包名(可以單獨指定施无,但是不能和包名重復(fù))。這個屬性主要和singleTask啟動模式或者allowTaskReparenting屬性配對使用必孤。
6.為Activity指定啟動模式:
-
通過AndroidMenifest為Activity指定啟動模式
<activity android:launchMode = "singleTask" />
-
通過在Intent中設(shè)置標志位來為Activity指定啟動模式猾骡,比如:
Intent intent = new Intent(); intent.setClass(MainActivity.this,SecondActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent);
7.可以通過adb shell dumpsys activity命令來查看活動棧中activity的情況
1.3 IntentFilter的匹配規(guī)則
1.intentFilter主要用來隱式啟動,隱式啟動需要Intent能夠匹配目標組件的IntentFilter中所設(shè)置的過濾信息敷搪。
2.主要的匹配項:
action:
一個過濾規(guī)則中可以有多個action兴想,只要Intent中的action能夠和過濾規(guī)則中的任何一個action相同即可匹配成功。category
category的匹配規(guī)則和action不同赡勘,它要求Intent中如果含有category嫂便,那么所有的category都必須和過濾規(guī)則中的其中一個category相同。當(dāng)然闸与,Intent中可以沒有category顽悼,如果沒有曼振,這個Intent仍然可以匹配成功。-
data的匹配規(guī)則(加粗是因為可以通過這個來傳遞數(shù)據(jù))
data語法如下:<data android:scheme = "string" android:host = "string" android:port = "string" android:path = "string" android:pathPattern = "string" android:pathPrefix= "string" android:mimeType = "string" />
data由兩個部分組成蔚龙,mineType和URI。mimeType指媒體類型映胁,比如image/jpeg木羹、audio/mpeg4-generic和video/*等,可以表示圖片解孙、文本坑填、視頻等不同的媒體格式,而URI中包含的數(shù)據(jù)就比較多了弛姜。
格式:<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern]
舉例:
content://com.example.project:200/folder/subfolder/etc
http://www.baidu.com:80/search/info
- Scheme: URI的模式脐瑰,比如http、file廷臼、content等苍在,如果URI中沒有指定scheme,那么整個URI的其他參數(shù)無效荠商,這也意味著URI是無效的寂恬。
- Host: URI的主機名,比如www.baidu.com莱没,如果host未指定初肉,那么整個URI中的其他參數(shù)無效。
- Port:URI中的端口號饰躲,比如80牙咏,僅當(dāng)URI中指定了scheme和host參數(shù)的時候port參數(shù)才是有意義的。
- Pah嘹裂、pathPattern和pathPrefix:這三個參數(shù)表述路徑信息妄壶,其中path表示完整的路徑;pathPattern也表示完整的路徑信息焦蘑,但是它里面可以包含通配符“*”盯拱,“*”表示0個或多個任意字符,需要注意例嘱,由于正則表達式的規(guī)范狡逢,如果想表示真實的字符串,那么“*”要寫成“\\*”,"\"要寫成“\\\\”;pathPrefix表示路徑的前綴信息拼卵。
舉個栗子:
Intent intent = new Intent("com.ryg.charpter_1.c");
intent.addCategory("com.ryg.category.c");
intent.setDataAndType(Uri.parse("file://abc"),“text/plain");
startActivity(intent);
好了奢浑,第一章的筆記就這么多,國際慣例來個圖輕松一下腋腮,上一張最近追的《西部世界》的劇照: