上面介紹了android的四大組件,下面將Activity的生命周期和啟動(dòng)模式來個(gè)全面的分析臭脓。
這是在任玉剛大神書下的總結(jié),讓我也有重新的認(rèn)識(shí)。希望這篇對(duì)大家都有所幫助。
Activity的生命周期的話 分為正常情況下生命周期和異常情況下生命周期。正常情況下的生命周期指的用戶點(diǎn)擊進(jìn)入一個(gè)界面時(shí)Activity所經(jīng)歷的生命周期;異常情況下的生命周期指的是Activity被系統(tǒng)回收或者由于當(dāng)前的設(shè)備屏幕進(jìn)行切換了嗤放。可以先看下Activity生命周期的流程圖壁酬,我再詳細(xì)說下下面的方法會(huì)在哪里走次酌。
正常情況下的Activity會(huì)經(jīng)歷以下的生命周期:?
1. OnCreate 表示 Activity正在創(chuàng)建,這也是生命周期的第一個(gè)方法也是必走的方法厨喂,在這里我們可以做一些初始化的工作和措,比如加載這個(gè)Activity 的布局呀,還有初始化一些所需的數(shù)據(jù)等庄呈。
2.OnRestart ?看上面的流程圖 可以會(huì)有一些凝問蜕煌,也有一些碼帥,或碼漂(妹子)已經(jīng)發(fā)現(xiàn)了。別急這里我再來介紹下這個(gè)方法诬留。首先這個(gè)方法字面意思斜纪,重啟的意思,沒錯(cuò)這指的就是Activity正在重啟啟動(dòng),當(dāng)目前的Activity在用戶的眼睛里不可見變成可見的時(shí)候,這個(gè)方法就會(huì)被調(diào)用文兑。這種情況一般是用戶按Home返回了也或者進(jìn)入另一個(gè)Activity(這里并沒有將這個(gè)Activity給finish掉)盒刚,這時(shí)的Activity就會(huì)不可見了(OnPause—>Onstop),接著用戶又返回到這個(gè)Activity,就會(huì)出現(xiàn)這種情況了绿贞。
3.OnStart 表示Activity正在啟動(dòng),這時(shí)的Activity已經(jīng)在后臺(tái)是可見的因块,但是沒有出現(xiàn)在前臺(tái),無法與用戶進(jìn)行交互籍铁。
4.OnResume 表示Activity已經(jīng)可見涡上,并處于前臺(tái)顯示,可以進(jìn)行與用戶進(jìn)行交互拒名。
5.OnPause 表示Activity正在停止,正常情況下吩愧,緊接著 OnStop就會(huì)被調(diào)用,在特殊情況下,如果這個(gè)時(shí)候用戶迅速的返回,那么會(huì)再調(diào)用OnResume,一般很難重現(xiàn)增显。此時(shí)可以進(jìn)行停止動(dòng)畫雁佳,但是注意不要進(jìn)行過大的耗時(shí)操作,因?yàn)檫@會(huì)影響到Activity的顯示同云。OnPause必須先執(zhí)行完糖权,新的Activity才會(huì)進(jìn)行。
6.OnStop 表示Activity即將停止炸站,可以做一些回收工作星澳,但同樣不能太耗時(shí)。
7 OnDestory 表示Activity即將被銷毀武契。這也是最后一個(gè)生命周期,在這里我們可以進(jìn)行一些資源釋放募判。
下面我舉的具體說明大家也可以兩個(gè)Acitivity 打印下生命周期 自己觀察下荡含。
(1)當(dāng)我們點(diǎn)擊按鈕打開一個(gè)界面時(shí) Activity的生命周期:OnCreate—>OnStart—>OnResume;
(2) 當(dāng)用戶點(diǎn)擊back時(shí) Activity的生命周期: OnPause—>OnStop—>OnDestory届垫;
(3) 當(dāng)用戶從aActivity 跳轉(zhuǎn)到bActivity時(shí) ?A生命周期: OnPause—>OnStop;B生命周期 ?OnCreate—>OnStart—>OnResume释液;我們?nèi)绻麖腷Activity返回到aActivity A的生命周期:OnRestart—>OnStart—>OnResume;B的生命周期?OnPause—>OnStop—>OnDestory装处;
(4)當(dāng)用戶用Home回到主界面 Activity的生命周期:OnPause—>OnStop 這里有個(gè)特殊情況就是 一旦我們采用的是透明主題
Activity的生命周期不會(huì)再調(diào)OnStop;
(5) 當(dāng)Activity被系統(tǒng)回收再次打開误债,生命周期的回調(diào)過程和(1)一樣。切記就是生命周期一樣妄迁。
我們可以這樣記Activity的生命周期 ?我們可以采用相規(guī)則 OnCreate—OnDestory寝蹈, onRestart—onStop,onResume—onPasue ?如果返回到A 那么多一個(gè)方法 OnRestart登淘;?
關(guān)于大神書下的Aactivity打開Bactivity 是先走a的onPasue ?還是b的onResume箫老。
我自己寫了一個(gè)Demo 從生命周期的運(yùn)行結(jié)果來看 是先走的a下的onPasue,然后才是b的onResume黔州。具體是怎么進(jìn)行耍鬓,大家可以去源碼里面看看。 正常情況下的生命周期到這里也就結(jié)束了流妻。
下面的是異常情況下的生命周期牲蜀,所謂異常就是沒有按照正常流程走,在中途出現(xiàn)Activity被殺死而重現(xiàn)創(chuàng)建绅这。資源文件發(fā)生改變或者內(nèi)存不足導(dǎo)致Activity被殺死涣达。
1.資源相關(guān)的系統(tǒng)配置發(fā)生改變導(dǎo)致Activity被殺死重新創(chuàng)建。
我這里舉個(gè)列子 我們?cè)趍ipmap目錄下 放一張圖片证薇,然后通過Resources去獲取這張圖片度苔,同時(shí)為了兼容不同的設(shè)備我們還需要在其他的一些目錄下放置不同的圖片,比如mipmap-xhdpi棕叫,mipmap-xxhdpi等林螃,當(dāng)程序啟動(dòng)時(shí),系統(tǒng)會(huì)根據(jù)當(dāng)前設(shè)備的情況去加載合適的Resources資源,比如說橫屏手機(jī)和豎屏手機(jī)就會(huì)拿到兩張不同的圖片俺泣,當(dāng)前我們的Activity目前是處于豎屏狀態(tài)疗认,如果屏幕突然旋轉(zhuǎn)了,由于系統(tǒng)配置發(fā)生了改變伏钠,在默認(rèn)情況下 我們的Activity會(huì)被銷毀并且重新創(chuàng)建横漏,當(dāng)然我們也可以阻止系統(tǒng)重新創(chuàng)建Activity。當(dāng)系統(tǒng)配置發(fā)生了改變熟掂,Activity 就會(huì)被銷毀缎浇,onPause,onStop赴肚,onDestory均會(huì)被調(diào)用素跺,但是由于Activity是異常停止二蓝,系統(tǒng)會(huì)調(diào)用onSaveIntanceState來保存當(dāng)前的 Activity狀態(tài),這個(gè)方法可以在onPause之前也或之后指厌,但是不能再onStop之后調(diào)用刊愚,因?yàn)槟菚r(shí)無法保存狀態(tài) 也不能進(jìn)行大量的耗時(shí)操作。當(dāng)Activity被重新創(chuàng)建踩验,系統(tǒng)則會(huì)調(diào)用onRestoreIntancestate鸥诽,然后onSaveIntancestate保存的Bundle對(duì)象就可以傳遞給onRestoreintancestate和onCreat方法,這時(shí)我們可以取出之前保存的數(shù)據(jù)并恢復(fù)的話箕憾,說明Activity被創(chuàng)建了牡借。我們下面來寫個(gè)旋轉(zhuǎn)屏幕的例子來驗(yàn)證系統(tǒng)會(huì)自己做數(shù)據(jù)存儲(chǔ)和恢復(fù)。 ? ? ? ? ? ? ? ? ??
?public class OnSaveintanceActivityextends AppCompatActivity {
@Override
? ? ? ? protected void onCreate(@Nullable Bundle savedInstanceState) {
????????????super.onCreate(savedInstanceState);
? ? ? ? ? ? setContentView(R.layout.activity_main);
? ? //? ? 因?yàn)榈谝淮芜M(jìn)來就走這個(gè)onCreate 所以再次判斷savedInstanceState不能為空
? ? ? ? ? ? if (savedInstanceState!=null){
????????????????String test=savedInstanceState.getString("test");
? ? ? ? ? ? ? ? Log.d(">>onCreateTest",test);
? ? ? ? ? ? }
}
@Override
? ? ? ? protected void onSaveInstanceState(Bundle outState) {
????????????super.onSaveInstanceState(outState);
? ? //? ? ? ? 這里我們將數(shù)據(jù)返回給 onRestoreInstanceState和onCreate;
? ? ? ? ? ? outState.putString("test","測(cè)試");
? ? ? ? }
@Override
? ? ? ? protected void onRestoreInstanceState(Bundle savedInstanceState) {
? ? ? ? ? ?String test=savedInstanceState.getString("test");
? ? ? ? ? ? Log.d(">>onRestoreTest",test);
? ? ? ? }
@Override
? ? ? ? protected void onPause() {
? ? ? ? ? super.onPause();
? ? ? ? ? ?Log.d(">>onPause","onPause");
? ? ? ? }
@Override
? ? ? ? protected void onStop() {
? ? ? ? ? super.onStop();
? ? ? ? ? ?Log.d(">>onStop","onStop");
? ? ? ? }
@Override
? ? ? ? protected void onDestroy() {
? ? ? ? ? super.onDestroy();
? ? ? ? ? ?Log.d(">>onDestroy","onDestroy");
? ? ? ? }
}
通過這個(gè)例子我們能清楚的知道 Activity被銷毀了以后調(diào)用onSaveIntanceState來保存數(shù)據(jù)袭异,重新創(chuàng)建以后在onCreate和onRestoreIntanceState中都能正確的得到我們保存的數(shù)據(jù)钠龙。剛剛我還想這樣來保存數(shù)據(jù) 減輕數(shù)據(jù)請(qǐng)求,但是我又做了一個(gè)測(cè)試扁远,這種情況只會(huì)發(fā)生在異常情況下俊鱼,也就是說Activity是異常停止刻像。正常情況下畅买,我們不會(huì)觸發(fā)這個(gè)過程。
2.資源內(nèi)存不足導(dǎo)致優(yōu)先級(jí)的Activity被殺死细睡。
Activity按照優(yōu)先級(jí)的順序從高到低谷羞,可以分為以下三種,
(1)前臺(tái)Activity 正在和用戶交互的Activity 優(yōu)先級(jí)是最高的
(2)可見但非在前臺(tái)顯示的Activity——比如Activity中彈出窗體溜徙,導(dǎo)致Activity是可見 但是無法和用戶直接進(jìn)行交互
(3)后臺(tái)的Activity——已經(jīng)被暫停的Activity湃缎,這樣的優(yōu)先級(jí)是最低〈酪迹可以理解為不可見 無法與用戶交互 ?優(yōu)先級(jí)最低嗓违。
當(dāng)系統(tǒng)內(nèi)存不足時(shí),系統(tǒng)就會(huì)按照上述優(yōu)先級(jí)殺死目標(biāo)Activity所在的進(jìn)程,并在后續(xù)通過onSaveIntanceState和onRestoreIntanceState來存儲(chǔ)數(shù)據(jù)和恢復(fù)數(shù)據(jù)图贸,如果一個(gè)進(jìn)程中沒有四大組件執(zhí)行蹂季,那么這個(gè)進(jìn)程將很快被系統(tǒng)殺死,因此一些后臺(tái)工作疏日,不適合脫離四大組件而單獨(dú)運(yùn)行偿洁,不然很容易被殺死,比較好的方法是將后臺(tái)工作放入Service中從而保證進(jìn)程有一定的優(yōu)先級(jí)沟优,這樣就不會(huì)容易地被系統(tǒng)殺死涕滋。我們知道當(dāng)系統(tǒng)配置發(fā)生改變后,Activity會(huì)被重新創(chuàng)建挠阁,有什么好的辦法不讓他重新創(chuàng)建呢宾肺。我們不想系統(tǒng)重新創(chuàng)建Activity可以給Activity指定configChanges屬性溯饵,比如不想讓屏幕旋轉(zhuǎn)我們可以加個(gè)讓他一直豎屏或橫屏,android:configChanges="orientation“锨用。