什么是Activity?Activity的生命周期始花!

剛剛接觸安卓,水平不高但是憑自己的堅(jiān)持相信能有一個(gè)不錯(cuò)的結(jié)果垄提,努力一把价捧,趁著年輕逼自己學(xué)點(diǎn)東西,貼貼微博希望能得到大家鼓勵(lì)让蕾,share make us better浪规,加油年輕人!探孝!


1.什么是Activity

Activity是安卓四大組件之一(還有Service笋婿、BroadcastReceiver、ContentProvider)再姑,在日常應(yīng)用中Activity是與用戶交互的接口萌抵,它提供了一個(gè)用戶完成相關(guān)操作的窗口。當(dāng)我們在開發(fā)中創(chuàng)建Activity后元镀,通過調(diào)用setContentView(View)方法來給該Activity指定一個(gè)布局界面绍填,而這個(gè)界面就是提供給用戶交互的接口。Android系統(tǒng)中是通過Activity棧的方式來管理Activity的栖疑,而Activity自身則是通過生命周期的方法來管理的自己的創(chuàng)建與銷毀讨永,既然如此,現(xiàn)在我們就來看看Activity生命周期是如何運(yùn)作的遇革。

1.生命周期中各個(gè)方法的含義和作用

(1)onCreate:create表示創(chuàng)建卿闹,這是Activity生命周期的第一個(gè)方法揭糕,也是我們在android開發(fā)中接觸的最多的生命周期方法。它本身的作用是進(jìn)行Activity的一些初始化工作锻霎,比如使用setContentView加載布局著角,對一些控件和變量進(jìn)行初始化等。但也有很多人將很多與初始化無關(guān)的代碼放在這旋恼,其實(shí)這是不規(guī)范的吏口。此時(shí)Activity還在后臺(tái),不可見冰更。所以動(dòng)畫不應(yīng)該在這里初始化产徊,因?yàn)榭床坏健?/p>

(2)onStart:start表示啟動(dòng),這是Activity生命周期的第二個(gè)方法蜀细。此時(shí)Activity已經(jīng)可見了舟铜,但是還沒出現(xiàn)在前臺(tái),我們還看不到奠衔,無法與Activity交互谆刨。其實(shí)將Activity的初始化工作放在這也沒有什么問題,放在onCreate中是由于官方推薦的以及我們開發(fā)的習(xí)慣归斤。

(3)onResume:resume表示繼續(xù)痴荐、重新開始,這名字和它的職責(zé)也相同官册。此時(shí)Activity經(jīng)過前兩個(gè)階段的初始化已經(jīng)蓄勢待發(fā)生兆。Activity在這個(gè)階段已經(jīng)出現(xiàn)在前臺(tái)并且可見了。這個(gè)階段可以打開獨(dú)占設(shè)備

(4)onPause:pause表示暫停膝宁,當(dāng)Activity要跳到另一個(gè)Activity或應(yīng)用正常退出時(shí)都會(huì)執(zhí)行這個(gè)方法鸦难。此時(shí)Activity在前臺(tái)并可見,我們可以進(jìn)行一些輕量級的存儲(chǔ)數(shù)據(jù)和去初始化的工作员淫,不能太耗時(shí)合蔽,因?yàn)樵谔D(zhuǎn)Activity時(shí)只有當(dāng)一個(gè)Activity執(zhí)行完了onPause方法后另一個(gè)Activity才會(huì)啟動(dòng),而且android中指定如果onPause在500ms即0.5秒內(nèi)沒有執(zhí)行完畢的話就會(huì)強(qiáng)制關(guān)閉Activity介返。從生命周期圖中發(fā)現(xiàn)可以在這快速重啟拴事,但這種情況其實(shí)很罕見,比如用戶切到下一個(gè)Activity的途中按back鍵快速得切回來圣蝎。

(5)onStop:stop表示停止刃宵,此時(shí)Activity已經(jīng)不可見了,但是Activity對象還在內(nèi)存中徘公,沒有被銷毀牲证。這個(gè)階段的主要工作也是做一些資源的回收工作。

(6)onDestroy:destroy表示毀滅关面,這個(gè)階段Activity被銷毀坦袍,不可見十厢,我們可以將還沒釋放的資源釋放,以及進(jìn)行一些回收工作捂齐。

(7)onRestart:restart表示重新開始蛮放,Activity在這時(shí)可見,當(dāng)用戶按Home鍵切換到桌面后又切回來或者從后一個(gè)Activity切回前一個(gè)Activity就會(huì)觸發(fā)這個(gè)方法奠宜。

一張來自官方文檔(http://developer.android.com/reference/android/app/Activity.html)的圖筛武,相信大家都看到過。

現(xiàn)在我們來說一下方法的具體流程:

1.Activity實(shí)例是由系統(tǒng)自動(dòng)創(chuàng)建挎塌,并在不同的狀態(tài)期間回調(diào)相應(yīng)的方法。一個(gè)最簡單的完整的Activity生命周期會(huì)按照如下順序回調(diào):onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy内边。稱之為entire lifetime榴都。

2.當(dāng)執(zhí)行onStart回調(diào)方法時(shí),Activity開始被用戶所見(也就是說漠其,onCreate時(shí)用戶是看不到此Activity的嘴高,那用戶看到的是哪個(gè)?當(dāng)然是此Activity之前的那個(gè)Activity)和屎,一直到onStop之前拴驮,此階段Activity都是被用戶可見,稱之為visible lifetime柴信。

3.當(dāng)執(zhí)行到onResume回調(diào)方法時(shí)套啤,Activity可以響應(yīng)用戶交互,一直到onPause方法之前随常,此階段Activity稱之為foreground lifetime潜沦。

在實(shí)際應(yīng)用場景中:

假設(shè)A Activity位于棧頂,此時(shí)用戶操作绪氛,從A Activity跳轉(zhuǎn)到B Activity唆鸡。那么對AB來說,具體會(huì)回調(diào)哪些生命周期中的方法呢枣察?回調(diào)方法的具體回調(diào)順序又是怎么樣的呢争占?

開始時(shí),A被實(shí)例化序目,執(zhí)行的回調(diào)有A:onCreate -> A:onStart -> A:onResume臂痕。

當(dāng)用戶點(diǎn)擊A中按鈕來到B時(shí),假設(shè)B全部遮擋住了A猿涨,將依次執(zhí)行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop刻蟹。

此時(shí)如果點(diǎn)擊Back鍵,將依次執(zhí)行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy

至此嘿辟,Activity棧中只有A舆瘪。在Android中片效,有兩個(gè)按鍵在影響Activity生命周期這塊需要格外區(qū)分下,即Back鍵和Home鍵英古。

此時(shí)如果按下Back鍵淀衣,系統(tǒng)返回到桌面,并依次執(zhí)行A:onPause -> A:onStop -> A:onDestroy召调。

此時(shí)如果按下Home鍵(非長按)膨桥,系統(tǒng)返回到桌面,并依次執(zhí)行A:onPause -> A:onStop唠叛。由此可見只嚣,Back鍵和Home鍵主要區(qū)別在于是否會(huì)執(zhí)行onDestroy。

此時(shí)如果長按Home鍵艺沼,不同手機(jī)可能彈出不同內(nèi)容册舞,Activity生命周期未發(fā)生變化(由小米2s測的,不知道其他手機(jī)是否會(huì)對Activity生命周期有影響)障般。

由于Android本身的特性调鲸,使得現(xiàn)在不少應(yīng)用都沒有直接退出應(yīng)用程序的功能,按照一般的邏輯挽荡,當(dāng)Activity棧中有且只有一個(gè)Activity時(shí)藐石,當(dāng)按下Back鍵此Activity會(huì)執(zhí)行onDestroy,那么下次點(diǎn)擊此應(yīng)用程圖標(biāo)將從重新啟動(dòng)定拟,因此于微,當(dāng)前不少應(yīng)用程序都是采取如Home鍵的效果,當(dāng)點(diǎn)擊了Back鍵青自,系統(tǒng)返回到桌面角雷,然后點(diǎn)擊應(yīng)用程序圖標(biāo),直接回到之前的Activity界面.

驗(yàn)證幾個(gè)主要的生命周期情況

package com.cmcm.activitylifecycle;

import android.content.Intent;

import android.support.v7.app.AppCompatActivity;import android.os.Bundle;

import android.view.View;import android.widget.Button;

public class MainActivity extends AppCompatActivity {

Button bt;

/** * Activity創(chuàng)建時(shí)被調(diào)用 * @param savedInstanceState */

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

LogUtils.e("onCreate is invoke!!!");

bt= (Button) findViewById(R.id.bt);

bt.setOnClickListener(new View.OnClickListener() {

@Override

public void onClick(View v) {

Intent i = new Intent(MainActivity.this,SecondActivity.class); startActivity(i);

} }); }

/** * Activity從后臺(tái)重新回到前臺(tái)時(shí)被調(diào)用 */

@Override

protected void onRestart() {

super.onRestart();

LogUtils.e("onRestart is invoke!!!");

}

/** *Activity創(chuàng)建或者從后臺(tái)重新回到前臺(tái)時(shí)被調(diào)用 */

@Override

protected void onStart() {

super.onStart();

LogUtils.e("onStart is invoke!!!");

}

/** *Activity創(chuàng)建或者從被覆蓋性穿、后臺(tái)重新回到前臺(tái)時(shí)被調(diào)用 */

@Override

protected void onResume() {

super.onResume();

LogUtils.e("onResume is invoke!!!");

}

/** * Activity被覆蓋到下面或者鎖屏?xí)r被調(diào)用 */

@Override

protected void onPause() {

super.onPause(); LogUtils.e("onPause is invoke!!!");

}

/** *退出當(dāng)前Activity或者跳轉(zhuǎn)到新Activity時(shí)被調(diào)用 */

@Override

protected void onStop() {

super.onStop(); LogUtils.e("onStop is invoke!!!");

}

/** *退出當(dāng)前Activity時(shí)被調(diào)用,調(diào)用之后Activity就結(jié)束了 */

@Override

protected void onDestroy() {

super.onDestroy(); LogUtils.e("onDestroy is invoke!!!");

}

}


下面我們倆綜合分析幾種生命周期方法的調(diào)用情況

1.我們先來分析Activity啟動(dòng)過程中所調(diào)用的生命周期方法勺三,運(yùn)行程序截圖如下:

從Log中我們可以看出Activity啟動(dòng)后,先調(diào)用了onCreate方法需曾,然后是onStart方法吗坚,最后是onResume方法,進(jìn)入運(yùn)行狀態(tài)呆万,此時(shí)Activity已在前臺(tái)顯示商源。因此, Activity啟動(dòng)–>onCreate()–>onStart()–>onResume()依次被調(diào)用

2.當(dāng)前Activity創(chuàng)建完成后谋减,按Home鍵回到主屏牡彻。按如上操作運(yùn)行截圖:


從Log中我們可以看出Activity啟動(dòng)后,先調(diào)用了onCreate方法,然后是onStart方法庄吼,最后是onResume方法缎除,進(jìn)入運(yùn)行狀態(tài),此時(shí)Activity已在前臺(tái)顯示总寻。因此器罐, Activity啟動(dòng)–>onCreate()–>onStart()–>onResume()依次被調(diào)用 2.當(dāng)前Activity創(chuàng)建完成后,按Home鍵回到主屏渐行。按如上操作運(yùn)行截圖:

3.當(dāng)我們點(diǎn)擊Home鍵回到主界面后轰坊,再次點(diǎn)擊App回到Activity時(shí),調(diào)用結(jié)果如下:


我們可以發(fā)現(xiàn)重新回到Activity時(shí)祟印,調(diào)用了onRestart方法肴沫,onStart方法,onResume方法蕴忆。因此颤芬, 當(dāng)我們再次回到原Activity時(shí)–>onRestart()–>onStart()–>onResume()依次被調(diào)用

4.當(dāng)我們在原有的Activity的基礎(chǔ)上打新的Activity時(shí),調(diào)用結(jié)果如下:

我們可看到原來的Activity調(diào)用的了onPause方法和onStop方法孽文。也就是說 在原Activity的基礎(chǔ)上開啟新的Activity,原Activity生命周期執(zhí)行方法順序?yàn)楱C>onPause()–>onStop()夺艰,事實(shí)上跟點(diǎn)擊home鍵是一樣的芋哭。但是這里有點(diǎn)要注意的是如果新的Activity使用了透明主題,那么當(dāng)前Activity不會(huì)回調(diào)onStop方法郁副。同時(shí)我們發(fā)現(xiàn)新Activity(SecondActivity)生命周期方法是在原Activity的onPause方法執(zhí)行完成后才可以被回調(diào)减牺,這也就是前面我們?yōu)槭裁凑f在onPause方法不能操作耗時(shí)任務(wù)的原因了。

5 當(dāng)我們點(diǎn)擊Back鍵回退時(shí)存谎,回調(diào)結(jié)果如下:

從Log我們可以看出拔疚,當(dāng)點(diǎn)擊Back鍵回退時(shí),相當(dāng)于退出了當(dāng)前Activity既荚,Activity將被銷毀稚失,因此 退出當(dāng)前Activity時(shí)–>onPause()–>onStop()–>onDestroy()依次被調(diào)用

小結(jié):到這里我們來個(gè)小結(jié),當(dāng)Activity啟動(dòng)時(shí)恰聘,依次會(huì)調(diào)用onCreate(),onStart(),onResume()句各,而當(dāng)Activity退居后臺(tái)時(shí)(不可見,點(diǎn)擊Home或者被新的Activity完全覆蓋)晴叨,onPause()和onStop()會(huì)依次被調(diào)用凿宾。當(dāng)Activity重新回到前臺(tái)(從桌面回到原Activity或者被覆蓋后又回到原Activity)時(shí),onRestart()兼蕊,onStart()初厚,onResume()會(huì)依次被調(diào)用。當(dāng)Activity退出銷毀時(shí)(點(diǎn)擊back鍵)孙技,onPause()产禾,onStop()排作,onDestroy()會(huì)依次被調(diào)用,到此Activity的整個(gè)生命周期方法回調(diào)完成∠掠現(xiàn)在我們再回頭看看之前的流程圖纽绍,應(yīng)該是相當(dāng)清晰了吧。嗯势似,這就是Activity整個(gè)典型的生命周期過程拌夏。下篇我們再來聊聊Activity的異常生命周期。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末履因,一起剝皮案震驚了整個(gè)濱河市障簿,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌栅迄,老刑警劉巖站故,帶你破解...
    沈念sama閱讀 217,277評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異毅舆,居然都是意外死亡西篓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評論 3 393
  • 文/潘曉璐 我一進(jìn)店門憋活,熙熙樓的掌柜王于貴愁眉苦臉地迎上來岂津,“玉大人,你說我怎么就攤上這事悦即∷背桑” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評論 0 353
  • 文/不壞的土叔 我叫張陵辜梳,是天一觀的道長粱甫。 經(jīng)常有香客問我,道長作瞄,這世上最難降的妖魔是什么茶宵? 我笑而不...
    開封第一講書人閱讀 58,356評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮宗挥,結(jié)果婚禮上节预,老公的妹妹穿的比我還像新娘。我一直安慰自己属韧,他們只是感情好安拟,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宵喂,像睡著了一般糠赦。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評論 1 301
  • 那天拙泽,我揣著相機(jī)與錄音淌山,去河邊找鬼。 笑死顾瞻,一個(gè)胖子當(dāng)著我的面吹牛泼疑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荷荤,決...
    沈念sama閱讀 40,135評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼会油!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起嫂冻,我...
    開封第一講書人閱讀 38,992評論 0 275
  • 序言:老撾萬榮一對情侶失蹤忱屑,失蹤者是張志新(化名)和其女友劉穎莺戒,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體澄暮,經(jīng)...
    沈念sama閱讀 45,429評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡馍刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評論 3 334
  • 正文 我和宋清朗相戀三年警没,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了杀迹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,785評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡摧茴,死狀恐怖苛白,靈堂內(nèi)的尸體忽然破棺而出购裙,到底是詐尸還是另有隱情躯畴,我是刑警寧澤,帶...
    沈念sama閱讀 35,492評論 5 345
  • 正文 年R本政府宣布耍贾,位于F島的核電站荐开,受9級特大地震影響着帽,放射性物質(zhì)發(fā)生泄漏仍翰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評論 3 328
  • 文/蒙蒙 一晦溪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧修噪,春花似錦整慎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至湾笛,卻和暖如春饮怯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背嚎研。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評論 1 269
  • 我被黑心中介騙來泰國打工蓖墅, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留库倘,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評論 2 370
  • 正文 我出身青樓论矾,卻偏偏與公主長得像教翩,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子贪壳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評論 2 354

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

  • 溝通之【用正確的方法去做對的事】 很多人只注重做對的事饱亿,但是僅僅做對的事情,而沒有科學(xué)合理的方法闰靴,也不一定會(huì)達(dá)到期...
    帆野先生閱讀 1,349評論 0 1
  • 明星再耀眼 也替代不了明月 明月再清亮 也替代不了太陽 太陽再光輝 也替代不了心臟 心臟再蓬勃 也替代不了希望
    琳之楓閱讀 158評論 0 0
  • 夜不會(huì)長眠彪笼,念沒有無源 2017.8.24 晴 又是一年秋風(fēng)起,天氣時(shí)好時(shí)壞蚂且,人的思緒也跟著變得繁...
    於昭閱讀 411評論 5 2
  • 今天是到小屋的第二天配猫,本來今天上午有個(gè)會(huì)議要去拍攝、但是最后取消了杏死,還是有點(diǎn)失落的泵肄,畢竟現(xiàn)在比較窮,所以我睡到了1...
    愛一人閱讀 286評論 0 0