1. 程式人生 > >第一章 Activity的生命週期和啟動模式

第一章 Activity的生命週期和啟動模式

生命週期

一、正常情況下的生命週期
1、onCreate()和onDestroy()是配對的,標誌著Activity的建立與銷燬
onStart()和onStop()是配對的,標誌著Activity是否可見
onResume()和onPause()是配對的,標誌著Activity是否在前臺
2、從A開啟B:
A:onPause()
B:onCreate()
B:onStart()
B:onResume()
A:onStop()

二、非正常情況下的生命週期
1、兩種情況:系統配置發生改變導致Activity被殺死並重新建立;資源記憶體不足導致低優先順序的Activity被殺死
1、onSaveInstanceState()在onStop()之前
onRestoreInstanceState()在onCreate()之後。onCreate()裡的Bundle可能為空,onRestoreInstance()裡的Bundle不會為空。兩個方法都可恢復資料,但官方文件建議使用onRestoreInstanceState()恢復。
2、系統會預設幫我們儲存當前Activity的檢視結構,並在Activity重啟時幫我們恢復這些資料
3、可以通過設定configChanges屬性可以避免一些情況重啟Activity,同時會回撥onConfigurationChanged()
4、Activity優先順序由高到低有如下三種:前臺Activity、可見但非前臺Activity、後臺Activity。當系統記憶體不足時,系統會按照上述優先順序殺死Activity所在的程序。如果一個程序沒有四大元件,那麼這個程序將很快被系統殺死。

啟動模式

IntentFilter

想隱式啟動一個特定的頁面,給的intent必須要滿足這個頁面的IntentFilter
1、action:如果IntentFilter設定了action(可以設定多個action),那麼intent在setAction時,這個action必須匹配IntentFilter中action的其中一個
2、category:intent可以add多個category,不管有幾個,每個category都必須是intentfilter裡定義過的
3、data:
1)data規則和action一樣。
2)如果intentfilter裡只指定,那麼intent裡只設置type為”image/*”就可以啟動該activity;但如果intent裡不僅設定type,還要設定uri,那麼這時uri的schema必須是file或者content才行,因為這是它的預設值,否則會報錯
3)如果intentfilter裡指定了mimetype和schema,那麼intent裡可以設定的比intentfilter裡的內容多,只要mimetype和schema能匹配就可以,比如intent裡不僅可以設定mimetype和schema,還可以多設定host等等
4、intent-filter:一個頁面可以設定多個intentfilter,只要其中一個被滿足就可以了
5、intent裡的內容不能比intentfilter裡的多。比如intentfilter裡只設置了action和category,這時有個intent滿足了它的要求,不過卻多設定了data,那麼這個intent也是啟動不了這個activity的
6、用隱式意圖啟動activity時,為了避免沒有對應的activity而造成應用crash,可以先通過PackageManager的queryActivity方法判斷一下有無對應的activity