Activity的生命周期(進(jìn)階第二天)

上面介紹了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生命周期的切換過程

正常情況下的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透明主題

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");

? ? ? ? }

}

旋轉(zhuǎn)時(shí)候的生命周期

通過這個(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“锨用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末瓣喊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子黔酥,更是在濱河造成了極大的恐慌藻三,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件跪者,死亡現(xiàn)場(chǎng)離奇詭異棵帽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)渣玲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門逗概,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忘衍,你說我怎么就攤上這事逾苫。” “怎么了枚钓?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵铅搓,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我搀捷,道長(zhǎng)星掰,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任嫩舟,我火速辦了婚禮付呕,結(jié)果婚禮上箱熬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好陶冷,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布豆茫。 她就那樣靜靜地躺著伸蚯,像睡著了一般撬码。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上镰绎,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天脓斩,我揣著相機(jī)與錄音,去河邊找鬼畴栖。 笑死随静,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播燎猛,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼恋捆,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了重绷?” 一聲冷哼從身側(cè)響起沸停,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎昭卓,沒想到半個(gè)月后愤钾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡候醒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年能颁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片倒淫。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡伙菊,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出敌土,到底是詐尸還是另有隱情镜硕,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布返干,位于F島的核電站兴枯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏犬金。R本人自食惡果不足惜念恍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望晚顷。 院中可真熱鬧,春花似錦疗疟、人聲如沸该默。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)栓袖。三九已至,卻和暖如春店诗,著一層夾襖步出監(jiān)牢的瞬間裹刮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國(guó)打工庞瘸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捧弃,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像违霞,于是被迫代替她去往敵國(guó)和親嘴办。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • 您的應(yīng)用中的Activity應(yīng)該做到如下需求: 1.用戶在使用應(yīng)用時(shí)接聽來電或切換到另一個(gè)應(yīng)用买鸽,它不會(huì)崩潰涧郊。 2....
    正陽(yáng)Android閱讀 526評(píng)論 1 0
  • 啟動(dòng)與銷毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例,Android 系統(tǒng)會(huì)通過調(diào)用對(duì)...
    安卓Boy閱讀 1,769評(píng)論 3 5
  • 本文出自 “阿敏其人” 簡(jiǎn)書博客,轉(zhuǎn)載或引用請(qǐng)注明出處看幼。 一双仍、前言 Activity,安卓四大組件之一桌吃。 每個(gè) A...
    阿敏其人閱讀 9,082評(píng)論 8 88
  • 啟動(dòng)與銷毀Activity 不同于使用 main() 方法啟動(dòng)應(yīng)用的其他編程范例朱沃,Android 系統(tǒng)會(huì)通過調(diào)用對(duì)...
    mouekz閱讀 644評(píng)論 0 0
  • 今日去花市,走走停兔┯眨看到很多不同種類的花逗物。可是走著走著卻想起來了姥姥瑟俭。姥姥在世的時(shí)候最喜歡花了翎卓。我小時(shí)候還從她家搬...
    樹皮醬閱讀 181評(píng)論 0 0