Activity的生命周期 1.正常情況下的生命周期 Activity的生命周期切換過程 關於onStart和onResume、onPause和onStop的不同,onStart和onStop是從Activity是否可見這個角度來回調,onResume和onPause是從Activity是否位於前臺 ...
Activity的生命周期
1.正常情況下的生命周期
- onCreate: Activity正在被創建,生命周期中的第一個方法,常在此方法中做一些初始化工作,比如調用setContentView方法,初始化Activity所需數據等。
- onRestart: 表示Activity正在重新啟動。一般情況下,當Acivity從不可見重新變為可見狀態時,onRestart方法就會被調用。
- onStart: 表示Activity正在被啟動,這是Activity已經可見,但是沒有出現在前臺,還無法與用戶交互。
- onResume: 表示Activity可見並出現在前臺開始活動。onStart和onResume都表示Activity可見,但是onStart的時候Activity還在後臺,onResume時Activity才顯示到前臺。
- onPause: Activity正在停止,此時可以做一些存儲數據、停止動畫等工作。但註意不能太耗時,因為會影響到新Activity的顯示,onPause必須先執行完,新Activity的onResume才能執行。
- onStop: Activity即將停止,可以做一些稍微重量級的回收工作,同樣不能太耗時。
- onDestory: Activity即將被銷毀,在這裡,做一些回收工作和資源的釋放。
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
- standard(標準模式): 也是系統的預設模式,每次啟動一個Activity都會重新創建一個新的實例,不管這個實例是否已經存在。onCreate、onStart、onResume都會被調用。
- singleTop(棧頂復用模式) 在這種模式下,如果新Activity的實例已經位於任務棧的棧頂,那麼此Activity不會被重新創建,同時回調它的onNewIntent方法,通過此方法的參數我們可以去除當前請求的信息。需要註意,這個Activity的onCreate、onStart方法不會被重新調用。如果新Activity的實例已經存在但不是位於棧頂,那麼新Activity仍然會重新創建。
- singleTask(棧內復用模式) 這是一種單例模式,在這種模式下,只要Activity在一個棧中存在,那麼多次啟動此Activity都不會重新創建實例,和singleTop一樣,系統也會回調其onNewIntent方法。如果棧中有這個實例,那麼會將該實例之上的Activity全部彈出棧,將該實例置於棧頂。
- singleInstance(單實例模式) 這是一種加強的singleTask模式,除了具有singleTask模式的所有特性之外,還加強了一點,就是具有此模式的Activity只能單獨的位於一個任務棧中。
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開發藝術探索》