一玫恳、Activity的生命周期
activity的生命周期分為典型情況下的生命周期和異常情況下的生命周期京办。
Activity典型的生命周期
1.典型情況下的生命周期惭婿,主要有七個方法,他們之間的執(zhí)行順序如圖1.1.1所示:
圖1.1.1
2.一個Activity去啟動另外一個Activity時候钥星,第一個Activity的onPause()方法先被調(diào)用后才能執(zhí)行第二個Activity的OnResume()方法,這也是為什么在OnPause方法里面不能做太耗時的操作编饺。
Activity異常的產(chǎn)生的情況透且,一般有資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重新創(chuàng)建秽誊,還有就是資源內(nèi)存不足導(dǎo)致低優(yōu)先級的Activity被殺死。
1.一般有資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重新創(chuàng)建的生命周期如圖1.1.2所示
當(dāng)系統(tǒng)配置發(fā)生改變最易,Activity會被銷毀,其onPause视译、onStop鄙早、onDestory均會被調(diào)用蝶锋,系統(tǒng)還會調(diào)用onSaveInstanceState來保存當(dāng)前Activity的狀態(tài)扳缕,這個方法調(diào)用在onStop之前躯舔。注意:這個方法只出現(xiàn)在Activity被異常終止的情況下,正常情況下系統(tǒng)不會回調(diào)這個方法豺妓。當(dāng)Activity被重新重建后训堆,系統(tǒng)會調(diào)用onRestoreInstanceState坑鱼,并且把onSaveInstanceState方法保存的Bundle對象作為參數(shù)同時傳遞給onRestoreInstancestate和onCreate方法鲁沥。可以通過onRestoreInstanceState和onCreate方法來判斷Activity是否被重建允扇,如果被重建了蔼两,可以取出之前保存的數(shù)據(jù)并恢復(fù)额划,onRestoreInstanceState的調(diào)用在onStart之后揖赴。
在onSaveInstanceState和onRestoreInstanceState方法中燥滑,系統(tǒng)默認(rèn)做了一定的恢復(fù)工作铭拧,默認(rèn)保存Activity的試圖結(jié)構(gòu),并在Acitivity重啟后恢復(fù)這些數(shù)據(jù)肪跋,比如文本框中的數(shù)據(jù)州既,ListView滾動的位置等吴叶,每個View都有onSaveInstanceState和onRestoreInstanceState這兩個方法晤郑。
關(guān)于保存和恢復(fù)View層次結(jié)構(gòu),系統(tǒng)的工作流程是這樣的诫龙,當(dāng)Activity發(fā)生意外終止時签赃,Activity會調(diào)用OnSaveIntanceState去保存數(shù)據(jù)锦聊,然后Activity會委托Windows去保存數(shù)據(jù),接著Windows再委托它上面的頂級容器去保存數(shù)據(jù)圆到。頂層的容器是一個ViewGroup马绝,一般來說時DecorView富稻。最后再有頂層的容器一一通知子元素來保存數(shù)據(jù)唉窃,這樣這個數(shù)據(jù)保存就完成了苟跪。這就是安卓中的委托機制件已,View的繪制和事件的分發(fā)都是用的委托機制兄猩。
2.資源內(nèi)存不足導(dǎo)致低優(yōu)先級的Activity被殺死
Activity按照優(yōu)先級從高到低枢冤,可分為如下三種:
(1)前臺Activity——正在和用戶交互的Activity淹真,優(yōu)先級最高
(2)可見但非前臺Activity——比如Activity中彈出了一個對話框,導(dǎo)致Activity可見但是位于后臺無法與用戶直接交互客扎。
(3)后臺Activity——已經(jīng)被暫停的Activity徙鱼,比如執(zhí)行了onStop疆偿,優(yōu)先級最低迅箩。
當(dāng)系統(tǒng)內(nèi)存不足時饲趋,系統(tǒng)就會按照上述優(yōu)先級去殺死目標(biāo)Activity所在的進程奕塑,并在后續(xù)通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù)龄砰。如果一個進程中沒有四大組件在執(zhí)行换棚,這個進程很容易被殺死固蚤,較好的方法是將后臺工作放入Service中保證有一定的優(yōu)先級,不容易被系統(tǒng)殺死燎孟。
如果當(dāng)某項內(nèi)容發(fā)生改變后缤弦,不想Activity重新創(chuàng)建碍沐,就可以給Activity指定configChanges屬性累提,多個值用“|”連接起來斋陪。
android:configChanges="orientation | keyboardHidden"
具體如圖1.1.3
圖1.1.3