Android開(kāi)發(fā)Activity的生命周期詳解
前言
Android生命周期分為兩部分:
- (1)典型情況下的生命周期。
- (2)異常情況下的生命周期。
典型情況下的生命周期分析
圖1 Activity的生命周期圖解
圖2 Activity生命周期的金字塔圖
(1)典型情況下的生命周期指在有用戶參與的情況下,Activity所經(jīng)過(guò)的生命周期的改變,正常情況下,Activity的常用生命周期有以下幾種情況:
- onCreate():Activity啟動(dòng)后第一個(gè)被調(diào)用的函數(shù),常用來(lái)進(jìn)行Activity的初始化,如創(chuàng)建View,綁定數(shù)據(jù)和恢復(fù)數(shù)據(jù)。
- onStart():當(dāng)Activity顯示在屏幕上時(shí),函數(shù)被調(diào)用。
- onRestart():Activity從停止?fàn)顟B(tài)進(jìn)入活動(dòng)狀態(tài)是調(diào)用。
- onResume():Activity可以接受用戶輸入時(shí),該函數(shù)被調(diào)用,此時(shí)的activity位于activity棧的棧頂。
- onPause():當(dāng)Activity進(jìn)入暫停狀態(tài)時(shí),該函數(shù)被調(diào)用,一般用來(lái)保存持久的數(shù)據(jù)或釋放占用的資源。
- onStop():當(dāng)Activity變?yōu)椴豢梢?jiàn)后,該函數(shù)被調(diào)用,Activity進(jìn)入停止?fàn)顟B(tài)。
- onDestroy():在Activity被終止前,被調(diào)用。
/*1.onCreate: 每個(gè)Activity在寫代碼的過(guò)程中都會(huì)看見(jiàn)這個(gè)函數(shù), 是聲明周期的第一個(gè)方法。 一般做一些資源和數(shù)據(jù)初始化的工作, 比如綁定相對(duì)應(yīng)的資源布局setContentView*/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /*2.onRestart: 字面意思表示Activity重新啟動(dòng),這個(gè)狀態(tài)一般由用戶切換應(yīng)用的行為產(chǎn)生, 比如從應(yīng)用切換到桌面或者切打開(kāi)新的Activity, 此時(shí)這個(gè)Activity就會(huì)調(diào)用onPause和onStop讓這個(gè)Activity進(jìn)入展廳狀態(tài)。 再回到這個(gè)Activity就是onRestart了*/ @Override protected void onRestart() { super.onRestart(); } /*3.onStart: 這個(gè)狀態(tài)我理解就是Activity啟動(dòng)中的一個(gè)過(guò)程, 就是啟動(dòng)中,但是還不能與用戶交互(用戶不可見(jiàn)), 屬于一個(gè)在后臺(tái)的狀態(tài)*/ @Override protected void onStart() { super.onStart(); } /*4.onResume: 表示Activity已經(jīng)可見(jiàn),且已經(jīng)開(kāi)始活動(dòng)。 與onStart類似的狀態(tài)但是就是屬于一種在前臺(tái)的狀態(tài)*/ @Override protected void onResume() { super.onResume(); } /*5.onPause: 是一個(gè)非常微妙的狀態(tài),處于正在停止的一個(gè)臨界點(diǎn), 就很難重現(xiàn)這種狀態(tài),就是在停止過(guò)程中, 先執(zhí)行onPause然后在onStop執(zhí)行之前, 回到Activity執(zhí)行onResume,這期間就是onPause的狀態(tài)。 此處可以做一些存儲(chǔ)數(shù)據(jù)停止動(dòng)畫的工作,但是不能太耗時(shí), 不然會(huì)影響到新Activity的顯示,只有這些操作做完, 新Activity的OnResume才會(huì)執(zhí)行。*/ @Override protected void onPause() { super.onPause(); } /*6.onStop: 表示Activity即將停止,可以做一些相對(duì)重量級(jí)的回收工作, 同樣不能太耗時(shí)。*/ @Override protected void onStop() { super.onStop(); } /*onDestroy 表示Activity即將被銷毀,這是Activity生命的盡頭, 可以做一些回收工作和資源的釋放。*/ @Override protected void onDestroy() { super.onDestroy(); }
(2)進(jìn)一步地,可以將Activity分為3種生存期:
- 完整生存期:在 onCreate() 和 onDestroy() 之間所經(jīng)歷的。
- 可見(jiàn)生存期:在 onStart() 和 onStop() 之間所經(jīng)歷的。
- 前臺(tái)生存期:在 onResume() 和 onPause() 之間所經(jīng)歷的。
(3)Activity的活動(dòng)狀態(tài):
- 運(yùn)行狀態(tài):位于返回棧棧頂?shù)幕顒?dòng)。
- 暫停狀態(tài):不在棧頂位置,但仍然可見(jiàn)。
- 停止?fàn)顟B(tài):不在棧頂位置,完全不可見(jiàn)??赡軙?huì)被系統(tǒng)回收。
- 銷毀狀態(tài):在返回棧中移除的活動(dòng)。
(返回棧:每啟動(dòng)一個(gè)新的活動(dòng),會(huì)在返回棧中入棧,并處于棧頂?shù)奈恢?。每銷毀一個(gè)活動(dòng),處于棧頂?shù)幕顒?dòng)會(huì)出棧,前一個(gè)入棧的活動(dòng)會(huì)重新處于棧頂?shù)奈恢?。?/p>
異常情況下的生命周期分析 (1)系統(tǒng)配置發(fā)生改變引起生命周期的異常變化
舉例:開(kāi)啟手機(jī)的自動(dòng)旋轉(zhuǎn)后,當(dāng)Activity從豎屏狀態(tài)轉(zhuǎn)變?yōu)闄M屏?xí)r,系統(tǒng)會(huì)自動(dòng)銷毀原先的Activity并重建。如果不做特殊處理,那么每當(dāng)系統(tǒng)配置改變時(shí),Activity都會(huì)銷毀重建,
如圖所示:
圖3 旋轉(zhuǎn)手機(jī)時(shí)Activity的生命周期變化情況
當(dāng)手機(jī)從豎屏轉(zhuǎn)變?yōu)闄M屏?xí)r,可以看到原Activity執(zhí)行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。當(dāng)原Activity銷毀后又會(huì)迅速的開(kāi)啟新的Activity執(zhí)行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最終新的Activity顯示在用戶界面上。onSaveInstanceState 和 onRestoreInstanceState 兩個(gè)方法僅在生命周期異常情況下執(zhí)行。onSaveInstanceState主要是對(duì)異常銷毀的Activity進(jìn)行數(shù)據(jù)保存,onRestoreInstanceState主要是對(duì)存儲(chǔ)的數(shù)據(jù)進(jìn)行恢復(fù),數(shù)據(jù)存取都是通過(guò)Bundle,因此我們可以在Bundle中附加個(gè)人數(shù)據(jù)進(jìn)行讀寫。經(jīng)過(guò)測(cè)試onSaveInstanceState在onStop前調(diào)用,onRestoreInstanceState在onStart方法后調(diào)用。這兩個(gè)方法執(zhí)行的過(guò)程中,系統(tǒng)會(huì)自動(dòng)對(duì)視圖進(jìn)行信息數(shù)據(jù)的存取,例如:ListView的滾動(dòng)位置等等。(2)資源內(nèi)存不足導(dǎo)致低優(yōu)先級(jí)的Activity被殺死
當(dāng)系統(tǒng)資源不足時(shí),系統(tǒng)會(huì)按照上述優(yōu)先級(jí)去殺死目標(biāo)的 Activity 所在的進(jìn)程,并在后續(xù)通過(guò) onSaveInstanceState 和 onRestoreInstanceState 來(lái)存儲(chǔ)和恢復(fù)數(shù)據(jù)。如果一些后臺(tái)的進(jìn)程脫離了四大組件而獨(dú)立運(yùn)行,那么這個(gè)進(jìn)程很快就被殺死。我們常常將后臺(tái)工作放到 Service 中保持進(jìn)程具有一定的優(yōu)先級(jí)。
圖4 configChanges添加orientation后的效果
當(dāng)系統(tǒng)配置改變時(shí)Activity會(huì)銷毀重建,通過(guò)在AndroidMainManifest.xml中為Activity添加configChanges屬性去避免這個(gè)情況。configChanges的屬性有很多,例如:orientation表示屏幕方向變化、KeyboardHidden表示虛擬鍵盤可訪問(wèn)性變化等,通過(guò)設(shè)置這些屬性后當(dāng)運(yùn)行過(guò)程中發(fā)生上述情況Activity既不會(huì)銷毀重建也不會(huì)調(diào)用 onSaveInstanceState 和 onRestoreInstanceState 兩個(gè)方法,而是執(zhí)行onConfigChanged方法。
問(wèn)題: (1)onStart 和 onResume、onPause 和 onStop 從功能描述上看大同小異,到底有什么區(qū)別呢?
這兩組方法對(duì)的回調(diào)意義不同,onState 和onStop 是從 Activity 是否可見(jiàn)這個(gè)角度來(lái)回調(diào)的,而 onResume 和 onPause 是從 Activity 是否位于前臺(tái)這個(gè)角度來(lái)回調(diào)的,不過(guò)在實(shí)際使用中沒(méi)有其他明顯區(qū)別。
(2)假設(shè)當(dāng)前Activity為A,如果這時(shí)用戶打開(kāi)了一個(gè)新的Activity B,那么B的onResume方法和A的onPause方法誰(shuí)先執(zhí)行呢?
根據(jù)Android的基本運(yùn)行機(jī)制,不能在onPause中執(zhí)行重量級(jí)的操作,因?yàn)楸仨歰nPause執(zhí)行完成以后新Activity才能onResume。onPause和onResume都不能執(zhí)行耗時(shí)的操作,尤其是onPause,這就意味著我們應(yīng)該在onStop中操作,從而使新的Activity顯示出來(lái)并切換到前臺(tái)。
到此這篇關(guān)于Android開(kāi)發(fā)Activity的生命周期詳解的文章就介紹到這了,更多相關(guān)Android Activity 內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
android之HttpPost&HttpGet使用方法介紹
下文直接講用法,先知道怎么用,再知道怎么回事,具體如下,感興趣的朋友可以參考下哈2013-06-06Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自由拖動(dòng)并顯示文字的懸浮框,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01Android實(shí)現(xiàn)延遲的幾種方法小結(jié)
這篇文章主要介紹了Android實(shí)現(xiàn)延遲的幾種方法,結(jié)合實(shí)例總結(jié)了Android實(shí)現(xiàn)延遲的幾種常見(jiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-02-02android 多點(diǎn)觸摸圖片縮放的具體實(shí)現(xiàn)方法
2013-06-06Android studio 2020中的Android SDK 下載教程
這篇文章主要介紹了Android studio 2020中的Android SDK 下載教程,本文圖文并茂給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03Android ActionBarActivity設(shè)置全屏無(wú)標(biāo)題實(shí)現(xiàn)方法總結(jié)
這篇文章主要介紹了Android ActionBarActivity設(shè)置全屏無(wú)標(biāo)題實(shí)現(xiàn)方法總結(jié)的相關(guān)資料,需要的朋友可以參考下2017-04-04詳解VirtualApk啟動(dòng)插件Activity
這篇文章主要介紹了詳解VirtualApk啟動(dòng)插件Activity,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-05-05Android ScrollView嵌套ExpandableListView顯示不正常的問(wèn)題的解決辦法
這篇文章主要介紹了Android ScrollView嵌套ExpandableListView顯示不正常的問(wèn)題的解決辦法的相關(guān)資料,需要的朋友可以參考下2017-02-02