一、Activity的生命周期如上圖所示梧躺,一目了然:
1、onCreate:表示Activity正在被創(chuàng)建傲绣,在這里可以做一些初始化的操作掠哥,比如調(diào)用setContentView去加載界面布局資源、初始化Activity所需數(shù)據(jù)等斜筐。
2龙致、onStart:表示Activity正在被啟動,即將開始顷链,此時Activity已經(jīng)可見目代,但是還沒有出現(xiàn)在前臺,無法和用戶進行交互操作嗤练。
3榛了、onResume:此時Activity已經(jīng)出現(xiàn)在前臺可見,并且開始活動煞抬,可以和用戶進行操作霜大。
4、onPause:表示Activity正在停止革答,在這里不能做一些太耗時的操作战坤,因為從當前Activity去打開新的Activity時,先執(zhí)行當前Activity的onPause方法后才去創(chuàng)建新的Activity(onCreate -> onStart -> onResume)残拐,所以如果做了耗時的操作會影響新Activity的顯示途茫。
5、onStop:表示Activity即將停止溪食,從前臺進入后臺囊卜。
6、onDestroy:Acitvity即將被銷毀,在此可以做一些回收工作和釋放資源栅组。
7雀瓢、onRestart:表示Acitvity正在重新啟動。當Activity從前臺進入后臺(onPause -> onStop)后又從后臺進入前臺時調(diào)用此方法玉掸。比如用戶按下Home鍵或者打開新的Activity后又回到這個Activity刃麸。
二、Activity各生命周期方法的執(zhí)行情況:
1排截、第一次啟動Activity:onCreat -> onStart -> onResume;
2嫌蚤、用戶打開新的Activity或切換到桌面:onPause -> onStop;
注:如果新打開的Activity采用透明主題(之前的Activity還能看到),當前Activity不會回調(diào)onStop断傲;
3脱吱、用戶在此回到當前Activity時:onRestart -> onStart -> onResume;
4、用戶按下back鍵回退或調(diào)用finish時:onPause -> onStop -> onDestroy;
5认罩、從整個生命周期來說箱蝠,onCreat和onDestroy是配對的,分表標識著Activity的創(chuàng)建和銷毀垦垂,并且只有一次調(diào)用宦搬。從Activity是否可見來說,onStart和onStop是配對的劫拗,隨著用戶的操作或者設(shè)備屏幕的點亮和熄滅间校,著兩個方法可能被調(diào)用多次。從Activity是否在前臺來說页慷,onResume和onPause是配對的憔足,隨著用戶操作或者設(shè)備屏幕的點亮和熄滅,這兩個方法可能被多次調(diào)用酒繁。
6滓彰、假設(shè)當前Activity為A,此時用戶打開新的Activity B,他們的生命周期方法調(diào)用是怎樣的州袒?
A? onPause -> B onCreat -> B onStart -> B onResume -> A onStop
三揭绑、onSaveInstanceState 和 onRestoreInstanceState
上面講到的是正常情況下典型的Activity的生命周期,下面我們來看一下異常情況下的生命周期:
1郎哭、資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死并重新創(chuàng)建:
1)
比較常見的情況比如旋轉(zhuǎn)手機屏幕為了適配而加載不同分辨率的圖片他匪,鍵盤的顯示與隱藏,系統(tǒng)語言的改變夸研,系統(tǒng)會重新配置相關(guān)資源導(dǎo)致Activity被殺死并重新創(chuàng)建邦蜜。
當系統(tǒng)配置發(fā)生變化后Activity會被銷毀(onPause -> onStop -> onDestroy),同時由于Activity是在異常情況下終止的,系統(tǒng)會調(diào)用onSaveInstanceState來保存Activity當前狀態(tài)陈惰。這個方法的調(diào)用是在onStop之前,他和onPause沒有既定的時序關(guān)系,既可能在onPause之前也可能在onPause之后(這個方法只會出現(xiàn)在Activity異常終止的情況下抬闯,正常情況下系統(tǒng)不會回調(diào)這個方法)井辆。當Activity被重新創(chuàng)建后,系統(tǒng)會調(diào)用onRestoreInstanceState溶握,并且把Activity銷毀時onSaveInstanceState方法所保存的Bundle對象作為參數(shù)傳遞給onRestoreInstanceStae和onCreat,因此我們可以通過onRestoreInstanceState和onCreat方法來判斷Activity是否被重新創(chuàng)建了杯缺,如果被重建了,那么我們可以取出之前保存的數(shù)據(jù)并恢復(fù)睡榆。從時序上來說萍肆,onRestoreInstanceState的調(diào)用時機在onStart之后。
在onSaveInstanceState和onRestoreInstanceState方法中系統(tǒng)會自動做一些恢復(fù)的工作胀屿。當Activity在異常情況下需要重新創(chuàng)建時塘揣,系統(tǒng)會默認為我們保存當前Activity的視圖結(jié)構(gòu),并且在Activity重啟后為我們恢復(fù)這些數(shù)據(jù)宿崭,比如文本框中輸入的數(shù)據(jù)亲铡、listView滾動的位置等,葡兑,這些View相關(guān)的狀態(tài)系統(tǒng)都能夠默認為我們恢復(fù)奖蔓。
下面的例子來驗證我們自己做數(shù)據(jù)恢復(fù)和存儲情況:
在onSaveInstanceState中存儲一個字符串,然后當Activity被銷毀再重新創(chuàng)后我們再去獲取之前存儲的字符串讹堤。接收的位置可以選擇onRestoreInstanceState或者onCreat吆鹤,二者的區(qū)別是:onRestoreInstanceState一旦被調(diào)用,其參數(shù)Bundle savedInstanceState一定是有值的洲守,我們不用額外判斷是否為空疑务;但是onCreat如果是正常啟動的話,其參數(shù)Bundle savedInstanceState為null岖沛,所以必須要額外判斷暑始。這兩個方法我們?nèi)芜x一個都可以進行數(shù)據(jù)恢復(fù),但是官方文檔建議采用onRestoreInstanceState去恢復(fù)數(shù)據(jù)婴削。下面是運行時候的數(shù)據(jù):
注意:針對onSaveInstanceState方法有一點需要說明廊镜,系統(tǒng)只會在Activity即將被銷毀并且有機會重新顯示的情況下才會去調(diào)用他(系統(tǒng)只會在Activity異常終止的時候才會去調(diào)用onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù),其他情況不會觸發(fā)這個過程)唉俗。
2)
我們知道嗤朴,當系統(tǒng)配置發(fā)生改變后,Activity會被重新創(chuàng)建虫溜,那有沒有辦法不重新創(chuàng)建呢雹姊?答案是有的。系統(tǒng)配置中有很多內(nèi)容衡楞,如果某項內(nèi)容發(fā)生改變后我們不想讓Activity重新創(chuàng)建吱雏,可以給Activity指定configChanges屬性。比如不想讓Activity在屏幕旋轉(zhuǎn)的時候重新創(chuàng)建,就可以給configChanges屬性添加?orientation這個值:
如果想指定多個值歧杏,可以用“|”連接起來镰惦,比如 android:configChanges="orientantion|keybord"。系統(tǒng)配置中所含的項目非常多犬绒,下面只介紹幾個常用的項目:
a旺入、orientation:屏幕方向發(fā)生了改變,這個是最常用的凯力,比如旋轉(zhuǎn)了手機屏幕茵瘾;
b、keyboard:鍵盤類型發(fā)生了改變咐鹤,比如用戶使用了外插鍵盤拗秘;
c、keyBoardHidden:鍵盤的可訪問性發(fā)生了改變慷暂,比如用戶調(diào)出了鍵盤聘殖;
d、screenSize:當屏幕的尺寸信息發(fā)生了改變行瑞,當旋轉(zhuǎn)設(shè)備屏幕時奸腺,屏幕尺寸會發(fā)發(fā)生改變,這個選項比較特殊血久,他和編譯選項有關(guān)突照,當編譯選項中的minSdkVersion和targetSdkVersion均低于13時,此選項不會導(dǎo)致Activity重啟氧吐,否則會導(dǎo)致Activity重啟(API 13新添加)讹蘑。
2、資源內(nèi)存不足導(dǎo)致低優(yōu)先級的Activity被殺死:
這種情況下的數(shù)據(jù)存儲和恢復(fù)過程和情況 1?完全一致筑舅。Activity的優(yōu)先級從高到低可以分為三種:
a座慰、前臺Activity :正在和用戶交互的Activity,優(yōu)先級最高翠拣。
b版仔、可見但非前臺Activity:比如Activity中彈出了一個對話框,導(dǎo)致Activity可見但是位于后臺無法和用戶直接交互误墓。
c蛮粮、后臺Activity:已經(jīng)被暫停了的Activyti,比執(zhí)行了onStop谜慌,優(yōu)先級最低然想。
當系統(tǒng)內(nèi)存不足時,系統(tǒng)就會按照上述優(yōu)先級去殺死目標Activity所在的進程欣范,并在后續(xù)通過onSaveInstanceState和onRestoreInstanceState來存儲和恢復(fù)數(shù)據(jù)变泄。