Android中的Activity生命周期總結(jié)
概述
有圖有真相,所以先上圖:

上圖是從Android官網(wǎng)截下的Activity的生命周期流程圖,結(jié)構(gòu)非常清晰,它描述了Activity在其生命周期中所有可能發(fā)生的情況以及發(fā)生的先后順序,下面就將結(jié)合此圖詳細(xì)介紹一下Activity的生命周期。
Activity四大基本狀態(tài)
Activity生命周期一般分為四個(gè)基本狀態(tài),分別是活動(dòng)狀態(tài)(running),暫停狀態(tài)(paused),停止?fàn)顟B(tài)(stopped)和死亡狀態(tài)。
1.活動(dòng)狀態(tài)(running)
活動(dòng)狀態(tài)一般是指該Activity正處于屏幕最顯著的位置上顯示,即該Activity是在Android活動(dòng)棧的最頂端。
一般地當(dāng)Activity 創(chuàng)建后就是處于該狀態(tài)中。
期間觸發(fā)的函數(shù)及順序?yàn)椋?onCreate() ->onStart() -> onResume()。
其中:
onCreate()只有在該Activity是第一次被創(chuàng)建時(shí)才會(huì)被調(diào)用,主要是負(fù)責(zé)Activity的一般性的初始化設(shè)置,包括視圖的創(chuàng)建,數(shù)據(jù)的綁定等等。需要注意的是若之前有凍結(jié)的state(即系統(tǒng)對(duì)該Activity調(diào)用過(guò)onSaveInstanceState()函數(shù)),則可以通過(guò)其 Bundle 參數(shù)進(jìn)行state恢復(fù)。
onStart()是當(dāng)Activity正在變?yōu)榭梢?jiàn)狀態(tài)時(shí)才會(huì)被調(diào)用。一般地在此期間可以注冊(cè)一個(gè)廣播等等。
onResume()是在該Activity將要和用戶(hù)進(jìn)行交互時(shí)被調(diào)用,此時(shí)Activity位于的活動(dòng)棧頂部。
2.暫停狀態(tài)(paused)
暫停狀態(tài)一般指該Activity已失去了焦點(diǎn)但仍然是可見(jiàn)的狀態(tài)(包括部分可見(jiàn))。一個(gè)處于暫停狀態(tài)的Activity只有在系統(tǒng)極度缺乏內(nèi)存資源的情況下才會(huì)被系統(tǒng)強(qiáng)制結(jié)束。
運(yùn)行狀態(tài)到暫停狀態(tài)所觸發(fā)的函數(shù)及順序?yàn)椋簅nResume() -> onPuased()。
暫停狀態(tài)恢復(fù)至運(yùn)行狀態(tài)所觸發(fā)的函數(shù)及順序?yàn)椋簅nPuased() -> onResume()。
其中:
onPuased()是當(dāng)一個(gè)Activity失去系統(tǒng)焦點(diǎn)后將會(huì)被調(diào)用,包括見(jiàn)面被部分遮擋,以及設(shè)備轉(zhuǎn)入休眠狀態(tài)等等。一般地在此期間對(duì)一些未保存的數(shù)據(jù)進(jìn)行持久化并停止其他需要耗費(fèi)CPU的操作,同時(shí)不可進(jìn)行耗時(shí)操作,否則會(huì)阻塞系統(tǒng)UI線程。
3.停止?fàn)顟B(tài)(stopped)
停止?fàn)顟B(tài)一般指該Activity被另一個(gè)Activity完全覆蓋的狀態(tài),這是它仍然保持所有的狀態(tài),但是由于該Activity變得不可見(jiàn),所以系統(tǒng)經(jīng)常會(huì)由于內(nèi)存不足而將該Activity強(qiáng)行結(jié)束。
暫停狀態(tài)到停止?fàn)顟B(tài)所觸發(fā)的函數(shù)及順序?yàn)椋簅nPuased() -> onStop()。
停止?fàn)顟B(tài)恢復(fù)至運(yùn)行狀態(tài)所觸發(fā)的函數(shù)及順序?yàn)椋簅nStop() -> onRestart() -> onStart() -> onResume()。
其中:
onStop()是當(dāng)一個(gè)Activity變?yōu)椴豢梢?jiàn)時(shí)將會(huì)被調(diào)用,此時(shí)可能是由于該Activity要被注銷(xiāo)或新的Activity完全遮擋了該Activity。在此期間一般可以進(jìn)行取消注冊(cè)廣播等操作,因?yàn)橛脩?hù)不可見(jiàn)。
onRestart()是當(dāng)一個(gè)Activity從停止?fàn)顟B(tài)恢復(fù)至運(yùn)行狀態(tài)時(shí)將會(huì)被優(yōu)先調(diào)用。
4.死亡狀態(tài)
死亡態(tài)是指該Activity被系統(tǒng)銷(xiāo)毀。當(dāng)一個(gè)Activity處于暫停狀態(tài)或停止?fàn)顟B(tài)時(shí)就隨處可能進(jìn)入死亡狀態(tài),因?yàn)橄到y(tǒng)可能因內(nèi)存不足而強(qiáng)行結(jié)束該Activity。
停止?fàn)顟B(tài)到死亡狀態(tài)分為兩種情況:(1)由用戶(hù)操作導(dǎo)致,則執(zhí)行:onStop() -> onDestroy()。(2)由系統(tǒng)自動(dòng)強(qiáng)制執(zhí)行,則該Activity被強(qiáng)行結(jié)束。
其中:
onDestroy()是當(dāng)一個(gè)Activity正在被系統(tǒng)finished期間被調(diào)用的。
Activity七大生命周期函數(shù)
Activity一共有七個(gè)生命周期函數(shù),分別為onCreate(),onRestart(),onStart(),onReusme(),onPause(),onStop(),onDestory()。它們的被調(diào)用的情況以及作用已在上一段中進(jìn)行了相關(guān)的介紹分析,在此就不再贅述。
其實(shí)在一個(gè)Activity整個(gè)生命周期中上述七大生命周期函數(shù)并不是一定都會(huì)被執(zhí)行的,有時(shí)由于系統(tǒng)內(nèi)存不足的緣故,部分生命周期函數(shù)將會(huì)被跳過(guò)不執(zhí)行。
一般地onCreate(),onRestart(),onStart(),onReusme()這四個(gè)函數(shù)是不能被系統(tǒng)跳過(guò)不執(zhí)行的,而onDestory()函數(shù)在系統(tǒng)內(nèi)存不足時(shí),該函數(shù)將直接被系統(tǒng)跳過(guò)不執(zhí)行。
onPause()函數(shù)比較特殊,即使在系統(tǒng)內(nèi)存不足時(shí),也一定會(huì)執(zhí)行完該函數(shù)后其Activity才會(huì)被強(qiáng)制結(jié)束,原因是下一個(gè)Activity在等到該函數(shù)結(jié)束前前是不會(huì)繼續(xù)進(jìn)行。所以該函數(shù)常常用于對(duì)數(shù)據(jù)的持久化操作,同時(shí)也禁止進(jìn)行任何耗時(shí)的操作。
onStop()函數(shù)則最為特殊,當(dāng)Android的運(yùn)行環(huán)境為HONEYCOMB即3.0之前的版本時(shí),onStop()函數(shù)是可以被系統(tǒng)跳過(guò)不執(zhí)行的。但是在HONEYCOMB即3.0之后的版本,onStop()函數(shù)和onPause()函數(shù)一樣不能被跳過(guò)不執(zhí)行。
切換橫豎屏觸發(fā)的生命周期事件
1.不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期,切橫屏?xí)r會(huì)執(zhí)行一次,切豎屏?xí)r會(huì)執(zhí)行兩次。
2.設(shè)置Activity的android:configChanges=”orientation”時(shí),切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫、豎屏?xí)r只會(huì)執(zhí)行一次。
3.在Android3.2之前,設(shè)置Activity的android:configChanges=”orientation|keyboardHidden”時(shí),切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法。但在Android3.2及其之后,仍會(huì)重新調(diào)用各個(gè)生命周期一次,因?yàn)閟creen size也開(kāi)始跟著設(shè)備的橫豎切換而改變。
4.Android3.2及其之后,設(shè)置Activity的android:configChanges=”orientation|keyboardHidden|screenSize“,切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法。
總結(jié)
關(guān)于Android中四大組件之一Activity的生命周期簡(jiǎn)介就先寫(xiě)到這里了,其實(shí)還有很多方面沒(méi)介紹到,例如對(duì)于onSaveInstanceState()函數(shù)和onRestoreInstanceState()函數(shù)的用法以及與onPause()函數(shù)間的區(qū)別都沒(méi)涉及,下次有機(jī)會(huì)再好好總結(jié),不行了實(shí)在是困死了,最后若本文有所疏忽及不當(dāng)之處歡迎大家指正。
- Android Activity的生命周期詳細(xì)介紹
- Android Activity生命周期詳解
- Android中Activity生命周期和啟動(dòng)模式詳解
- Android開(kāi)發(fā)之a(chǎn)ctivity的生命周期詳解
- Android開(kāi)發(fā)中Activity的生命周期及加載模式詳解
- Android Activity 橫豎屏切換的生命周期
- Android中Fragment與Activity的生命周期對(duì)比
- Android編程之基于Log演示一個(gè)activity生命周期實(shí)例詳解
- 兩分鐘讓你徹底明白Android Activity生命周期的詳解(圖文介紹)
- android橫豎屏切換時(shí)候Activity的生命周期
- Android Activity生命周期和堆棧管理的詳解
相關(guān)文章
Android編程中TextView寬度過(guò)大導(dǎo)致Drawable無(wú)法居中問(wèn)題解決方法
這篇文章主要介紹了Android編程中TextView寬度過(guò)大導(dǎo)致Drawable無(wú)法居中問(wèn)題解決方法,以實(shí)例形式較為詳細(xì)的分析了TextView設(shè)置及xml布局與調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-10-10
Android中的Intent Filter匹配規(guī)則簡(jiǎn)介
這篇文章主要為大家詳細(xì)介紹了Android中的Intent Filter匹配規(guī)則,感興趣的小伙伴們可以參考一下2016-04-04
Android中自定義View的實(shí)現(xiàn)方式總結(jié)大全
這篇文章主要總結(jié)了Android中自定義View的實(shí)現(xiàn)方式的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者們學(xué)習(xí)或者使用自定義View具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-04-04
Android多線程處理機(jī)制中的Handler使用介紹
本文將為大家介紹下Android的Handler的使用方法,Handler可以發(fā)送Messsage和Runnable對(duì)象到與其相關(guān)聯(lián)的線程的消息隊(duì)列,感興趣的朋友可以了解下哈2013-06-06
簡(jiǎn)單掌握Android開(kāi)發(fā)中彩信的發(fā)送接收及其附件的處理
這篇文章主要介紹了簡(jiǎn)單掌握Android開(kāi)發(fā)中彩信的發(fā)送接收及其附件的處理,由于微信的流行,使用彩信的用戶(hù)已經(jīng)很少了,簡(jiǎn)單了解即可,需要的朋友可以參考下2016-02-02
Android實(shí)現(xiàn)自動(dòng)提取短信驗(yàn)證碼功能
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)提取短信驗(yàn)證碼功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-01-01

