Activity隨筆,
Activity的生命週期
1.正常情況下的生命週期
Activity的生命週期切換過程
關於onStart和onResume、onPause和onStop的不同,onStart和onStop是從Activity是否可見這個角度來回調,onResume和onPause是從Activity是否位於前台這個角度來回調的,除了這種區別,在實際使用中沒有其他明顯的區別。
2.異常情況下的生命週期分析
資源相關的系統配置發生改變導致Activity被殺死並重新建立
異常情況下Activity的重建過程
當手機旋轉螢幕時,系統配置方式發生邊,在預設情況下Activity就會被銷毀並且重新建立。當系統配置發生改變後,Activity會被銷毀,其onPause、onStop、onDestory均會被調用,同時由於Activity是在異常情況下終止的,系統會調用onSaveInstanceState來儲存當前Activity的狀態(正常情況下系統不會調用這個方法)。這個方法調用時機在onStop之前,和onPause沒有時序關係(可能在onPause之前也可能之後)。當Activity被重新建立之後,系統會調用onRestoreInstanceState,並且把Activity銷毀時onSaveInstanceState儲存的bundle傳給onRestoreInstanceState和onCreate方法。可以通過bundle是否為空白來判斷Activity是否被重建了。如果被重建了,可以取出之前儲存的資料並恢複,從時序上來講,onRestoreInstanceState的調用時機在onStart之後。一般情況下,旋轉螢幕後Activity會重新建立。但是當設定Activity的configChanges屬性為orientation|screenSize之後Activity不會重新建立。
3.Activity的啟動模式LaunchMode
4.Activity的Flags
FLAG_ACTIVITY_NEW_TASK
這個標記位的作用是為Activity指定“singleTask”啟動模式,其效果和在XML中指定該模式相同。
FLAG_ACTIVITY_SINGLE_TOP
這個標記位的作用是為Activity指定“singleTop”啟動模式,其效果和在XML中指定該模式相同。
FLAG_ACTIVITY_CLEAR_TOP
具有此標記位的Activity,當它啟動時,在同一個任務棧中所有位於它上面的Activity都要出棧。
5.IntentFilter的匹配規則
隱式調用需要Intent能夠匹配目標組件的IntentFilter中所設定的過濾資訊,如果不匹配將無法啟動目標Activity。IntentFilter中的過濾資訊有action、category、data。一個Intent只有同時匹配action類別、category類別、data類別才算完全符合。另外,一個Activity中可以有多個intent-filter,一個Intent只要能匹配任何一組intent-filter即可成功啟動對應的Activity。
1.action的匹配規則
action是一個字串,系統預定義了一些action,我們也可以在應用中定義自己的action。action的匹配要求Intent中的action存在且必須和過濾規則中的其中一個action相同,這裡需要注意和category匹配規則的不同。action區分大小寫,大小寫不同字串相同的action會匹配失敗。
2.category的匹配規則
Intent中如果有category,那麼所有的category都必須和過濾規則中的其中一個category相同。當然,Intent中可以沒有category,但它仍然可以匹配成功,原因是系統在調用startActivity和startActivityForResult的時候會預設為Intent加上“android.intent.category.DEFAULT”這個category。同時為了我們的activity能夠接收隱式調用,就必須在intent-filter中指定“android.intent.category.DEFAULT”這個category。
3.data的匹配規則
data由兩部分組成,mimeType和URI。mimeType指媒體類型,比如image/jpeg、audio/mpeg4-generic和video/*等,而URI中包含的資料就比較多了。下面是URI的結構:
<scheme>://<host>:<port>/[<path>|<pathPrefix>|<pathPattern>]
Scheme: URI的模式,比如http、file、content等,如果URI中沒有指定scheme,那麼整個URI是無效的。
Host: URI的主機名稱,比如www.biadu.com
Port: URI中的連接埠號碼
Path、pathPattern和pathPrefix: 這三個參數表述路徑資訊,其中path表示完整的路徑;pathPattern也表示完整的路徑資訊,但是它裡面可以包含萬用字元;pathPrefix表示路徑的首碼資訊。
最後,當我們通過隱式方式啟動一個Activity的時候,可以做一下判斷,看是否有Activity能夠匹配我們的隱式Intent。判斷方法有兩種:採用PackageManager的resolveActivity方法或者Intent的resolveActivity方法如果找不到匹配的Activity就會返回null。
參考自《Android開發藝術探索》