[Android]《Android艺术开发探索》第一章读书笔记
1. 典型情況下生命周期分析
(1)一般情況下,當當前Activity從不可見重新變?yōu)榭梢姞顟B(tài)時,onRestart方法就會被調(diào)用。
(2)當用戶打開新的Activity或者切換到桌面的時候,回調(diào)如下:onPause -> onStop,但是如果新Activity采用了透明主題,那么onStop方法不會被回調(diào)。當用戶再次回到原來的Activity時,回調(diào)如下:onRestart -> onStart -> onResume。
(3)onStart和onStop對應(yīng),它們是從Activity是否可見這個角度來回調(diào)的;onPause和onResume方法對應(yīng),它們是從Activity是否位于前臺這個角度來回調(diào)的。
(4)從Activity A進入到Activity B,回調(diào)順序是onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A),所以不能在onPause方法中做重量級的操作。
2. 異常情況下生命周期分析
(1)onSaveInstanceState方法只會出現(xiàn)在Activity被異常終止的情況下,它的調(diào)用時機是在onStop之前,它和onPause方法沒有既定的時序關(guān)系,可能在它之前,也可能在它之后。當Activity被重新創(chuàng)建的時候,onRestoreInstanceState會被回調(diào),它的調(diào)用時機是onStart之后。
系統(tǒng)只會在Activity即將被銷毀并且有機會重新顯示的情況下才會去調(diào)用onSaveInstanceState方法。
當Activity在異常情況下需要重新創(chuàng)建時,系統(tǒng)會默認為我們保存當前Activity的視圖結(jié)構(gòu),并且在Activity重啟后為我們恢復(fù)這些數(shù)據(jù),比如文本框中用戶輸入的數(shù)據(jù)、listview滾動的位置等,這些view相關(guān)的狀態(tài)系統(tǒng)都會默認為我們恢復(fù)。具體針對某一個view系統(tǒng)能為我們恢復(fù)哪些數(shù)據(jù)可以查看view的源碼中的onSaveInstanceState和onRestoreInstanceState方法。(2)Activity按優(yōu)先級的分類
前臺Activity;可見但非前臺Activity;后臺Activity(3)android:configChanges="xxx"屬性,常用的主要有下面三個選項:
local:設(shè)備的本地位置發(fā)生了變化,一般指切換了系統(tǒng)語言;
keyboardHidden:鍵盤的可訪問性發(fā)生了變化,比如用戶調(diào)出了鍵盤;
orientation:屏幕方向發(fā)生了變化,比如旋轉(zhuǎn)了手機屏幕。
配置了android:configChanges="xxx"屬性之后,Activity就不會在對應(yīng)變化發(fā)生時重新創(chuàng)建,而是調(diào)用Activity的onConfigurationChanged方法。
1.2 Activity的啟動模式
1.2.1 啟動模式
(1)當任務(wù)棧中沒有任何Activity的時候,系統(tǒng)就會回收這個任務(wù)棧。
(2)從非Activity類型的Context(例如ApplicationContext、Service等)中以standard模式啟動新的Activity是不行的,因為這類context并沒有任務(wù)棧,所以需要為待啟動Activity指定FLAG_ACTIVITY_NEW_TASK標志位。
(3)任務(wù)棧分為前臺任務(wù)棧和后臺任務(wù)棧,后臺任務(wù)棧中的Activity位于暫停狀態(tài),用戶可以通過切換將后臺任務(wù)棧再次調(diào)到前臺。
(4)參數(shù)TaskAffinity用來指定Activity所需要的任務(wù)棧,意為任務(wù)相關(guān)性。默認情況下,所有Activity所需的任務(wù)棧的名字為應(yīng)用的包名。TaskAffinity屬性主要和singleTask啟動模式或者allowTaskReparenting屬性配對使用,在其他情況下沒有意義。
當TaskAffinity和singleTask啟動模式配對使用的時候,它是具有該模式的Activity的目前任務(wù)棧的名字,待啟動的Activity會運行在名字和TaskAffinity相同的任務(wù)棧中;
當TaskAffinity和allowTaskReparenting結(jié)合的時候,當一個應(yīng)用A啟動了應(yīng)用B的某個Activity C后,如果Activity C的allowTaskReparenting屬性設(shè)置為true的話,那么當應(yīng)用B被啟動后,系統(tǒng)會發(fā)現(xiàn)Activity C所需的任務(wù)棧存在了,就將Activity C從A的任務(wù)棧中轉(zhuǎn)移到B的任務(wù)棧中。(5)singleTask模式的具體分析:當一個具有singleTask啟動模式的Activity請求啟動之后,系統(tǒng)首先會尋找是否存在A想要的任務(wù)棧,如果不存在,就重新創(chuàng)建一個任務(wù)棧,然后創(chuàng)建Activity的實例把它放到棧中;如果存在Activity所需的任務(wù)棧,這時候要看棧中是否有Activity實例存在,如果有,那么系統(tǒng)就會把該Activity實例調(diào)到棧頂,并調(diào)用它的onNewIntent方法(它之上的Activity會被迫出棧,所以singleTask模式具有FLAG_ACTIVITY_CLEAR_TOP效果);如果Activity實例不存在,那么就創(chuàng)建Activity實例并把它壓入棧中。
(6)設(shè)置啟動模式既可以使用xml屬性android:launchMode,也可以使用代碼intent.addFlags()。區(qū)別在于限定范圍不同,前者無法直接為Activity設(shè)置FLAG_ACTIVITY_CLEAR_TOP標識,而后者無法為Activity指定singleInstance模式。
1.3 IntentFilter的匹配規(guī)則
- (1)IntentFilter中的過濾信息有action、category、data,為了匹配過濾列表,需要同時匹配過濾列表中的action、category、data信息,否則匹配失敗。一個過濾列表中的action、category、data可以有多個,所有的action、category、data分別構(gòu)成不同類別,同一類別的信息共同約束當前類別的匹配過程。只有一個Intent同時匹配action類別、category類別和data類別才算完全匹配,只有完全匹配才能成功啟動目標Activity。此外,一個Activity中可以有多個intent-filter,一個Intent只要能匹配任何一組intenf-filter即可成功啟動對應(yīng)的Activity。
(2)action匹配規(guī)則
只要Intent中的action能夠和過濾規(guī)則中的任何一個action相同即可匹配成功,action匹配區(qū)分大小寫。(3)category匹配規(guī)則
Intent中如果有category那么所有的category都必須和過濾規(guī)則中的其中一個category相同,如果沒有category的話那么就是默認的category,即android.intent.category.DEFAULT,所以為了Activity能夠接收隱式調(diào)用,配置多個category的時候必須加上默認的category。- (4)data匹配規(guī)則
data的結(jié)構(gòu)很復(fù)雜,語法大致如下:
主要由mimeType和URI組成,其中mimeType代表媒體類型,而URI的結(jié)構(gòu)也復(fù)雜,大致如下:
<scheme>://<host>:<port>/[<path>]|[<pathPrefix>]|[pathPattern]例如content://com.example.project:200/folder/subfolder/etc
scheme、host、port分別表示URI的模式、主機名和端口號,其中如果scheme或者host未指定那么URI就無效。
path、pathPattern、pathPrefix都是表示路徑信息,其中path表示完整的路徑信息,pathPrefix表示路徑的前綴信息;pathPattern表示完整的路徑,但是它里面包含了通配符(*)。
data匹配規(guī)則:Intent中必須含有data數(shù)據(jù),并且data數(shù)據(jù)能夠完全匹配過濾規(guī)則中的某一個data。
URI有默認的scheme!
如果過濾規(guī)則中的mimeType指定為image/或者text/等這種類型的話,那么即使過濾規(guī)則中沒有指定URI,URI有默認的scheme是content和file!如果過濾規(guī)則中指定了scheme的話那就不是默認的scheme了。
如果要為Intent指定完整的data,必須要調(diào)用setDataAndType方法!
不能先調(diào)用setData然后調(diào)用setType,因為這兩個方法會彼此清除對方的值。
intent.setDataAndType(Uri.parse("file://abc"), "image/png");
data的下面兩種寫法作用是一樣的:
如何判斷是否有Activity能夠匹配我們的隱式Intent?
(1)PackageManager的resolveActivity方法或者Intent的resolveActivity方法:如果找不到就會返回null
(2)PackageManager的queryIntentActivities方法:它返回所有成功匹配的Activity信息
針對Service和BroadcastReceiver等組件,PackageManager同樣提供了類似的方法去獲取成功匹配的組件信息,例如queryIntentServices、queryBroadcastReceivers等方法
有一類action和category比較重要,它們在一起用來標明這是一個入口Activity,并且會出現(xiàn)在系統(tǒng)的應(yīng)用列表中。
<intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /> </intent-filter>轉(zhuǎn)載于:https://www.cnblogs.com/zhousysu/p/5483781.html
總結(jié)
以上是生活随笔為你收集整理的[Android]《Android艺术开发探索》第一章读书笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 软件测试的原则依据
- 下一篇: Android Framework---