Android開發(fā)Activity的生命周期詳解
前言
Android生命周期分為兩部分:
- (1)典型情況下的生命周期。
- (2)異常情況下的生命周期。
典型情況下的生命周期分析

圖1 Activity的生命周期圖解

圖2 Activity生命周期的金字塔圖
(1)典型情況下的生命周期指在有用戶參與的情況下,Activity所經(jīng)過的生命周期的改變,正常情況下,Activity的常用生命周期有以下幾種情況:
- onCreate():Activity啟動后第一個被調(diào)用的函數(shù),常用來進行Activity的初始化,如創(chuàng)建View,綁定數(shù)據(jù)和恢復數(shù)據(jù)。
- onStart():當Activity顯示在屏幕上時,函數(shù)被調(diào)用。
- onRestart():Activity從停止狀態(tài)進入活動狀態(tài)是調(diào)用。
- onResume():Activity可以接受用戶輸入時,該函數(shù)被調(diào)用,此時的activity位于activity棧的棧頂。
- onPause():當Activity進入暫停狀態(tài)時,該函數(shù)被調(diào)用,一般用來保存持久的數(shù)據(jù)或釋放占用的資源。
- onStop():當Activity變?yōu)椴豢梢姾螅摵瘮?shù)被調(diào)用,Activity進入停止狀態(tài)。
- onDestroy():在Activity被終止前,被調(diào)用。
/*1.onCreate:
每個Activity在寫代碼的過程中都會看見這個函數(shù),
是聲明周期的第一個方法。
一般做一些資源和數(shù)據(jù)初始化的工作,
比如綁定相對應的資源布局setContentView*/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
/*2.onRestart:
字面意思表示Activity重新啟動,這個狀態(tài)一般由用戶切換應用的行為產(chǎn)生,
比如從應用切換到桌面或者切打開新的Activity,
此時這個Activity就會調(diào)用onPause和onStop讓這個Activity進入展廳狀態(tài)。
再回到這個Activity就是onRestart了*/
@Override
protected void onRestart() {
super.onRestart();
}
/*3.onStart:
這個狀態(tài)我理解就是Activity啟動中的一個過程,
就是啟動中,但是還不能與用戶交互(用戶不可見),
屬于一個在后臺的狀態(tài)*/
@Override
protected void onStart() {
super.onStart();
}
/*4.onResume:
表示Activity已經(jīng)可見,且已經(jīng)開始活動。
與onStart類似的狀態(tài)但是就是屬于一種在前臺的狀態(tài)*/
@Override
protected void onResume() {
super.onResume();
}
/*5.onPause:
是一個非常微妙的狀態(tài),處于正在停止的一個臨界點,
就很難重現(xiàn)這種狀態(tài),就是在停止過程中,
先執(zhí)行onPause然后在onStop執(zhí)行之前,
回到Activity執(zhí)行onResume,這期間就是onPause的狀態(tài)。
此處可以做一些存儲數(shù)據(jù)停止動畫的工作,但是不能太耗時,
不然會影響到新Activity的顯示,只有這些操作做完,
新Activity的OnResume才會執(zhí)行。*/
@Override
protected void onPause() {
super.onPause();
}
/*6.onStop:
表示Activity即將停止,可以做一些相對重量級的回收工作,
同樣不能太耗時。*/
@Override
protected void onStop() {
super.onStop();
}
/*onDestroy
表示Activity即將被銷毀,這是Activity生命的盡頭,
可以做一些回收工作和資源的釋放。*/
@Override
protected void onDestroy() {
super.onDestroy();
}(2)進一步地,可以將Activity分為3種生存期:
- 完整生存期:在 onCreate() 和 onDestroy() 之間所經(jīng)歷的。
- 可見生存期:在 onStart() 和 onStop() 之間所經(jīng)歷的。
- 前臺生存期:在 onResume() 和 onPause() 之間所經(jīng)歷的。
(3)Activity的活動狀態(tài):
- 運行狀態(tài):位于返回棧棧頂?shù)幕顒印?/li>
- 暫停狀態(tài):不在棧頂位置,但仍然可見。
- 停止狀態(tài):不在棧頂位置,完全不可見??赡軙幌到y(tǒng)回收。
- 銷毀狀態(tài):在返回棧中移除的活動。
(返回棧:每啟動一個新的活動,會在返回棧中入棧,并處于棧頂?shù)奈恢?。每銷毀一個活動,處于棧頂?shù)幕顒訒鰲#耙粋€入棧的活動會重新處于棧頂?shù)奈恢?。?/p>
異常情況下的生命周期分析 (1)系統(tǒng)配置發(fā)生改變引起生命周期的異常變化
舉例:開啟手機的自動旋轉(zhuǎn)后,當Activity從豎屏狀態(tài)轉(zhuǎn)變?yōu)闄M屏時,系統(tǒng)會自動銷毀原先的Activity并重建。如果不做特殊處理,那么每當系統(tǒng)配置改變時,Activity都會銷毀重建,
如圖所示:

圖3 旋轉(zhuǎn)手機時Activity的生命周期變化情況
當手機從豎屏轉(zhuǎn)變?yōu)闄M屏時,可以看到原Activity執(zhí)行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。當原Activity銷毀后又會迅速的開啟新的Activity執(zhí)行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最終新的Activity顯示在用戶界面上。onSaveInstanceState 和 onRestoreInstanceState 兩個方法僅在生命周期異常情況下執(zhí)行。onSaveInstanceState主要是對異常銷毀的Activity進行數(shù)據(jù)保存,onRestoreInstanceState主要是對存儲的數(shù)據(jù)進行恢復,數(shù)據(jù)存取都是通過Bundle,因此我們可以在Bundle中附加個人數(shù)據(jù)進行讀寫。經(jīng)過測試onSaveInstanceState在onStop前調(diào)用,onRestoreInstanceState在onStart方法后調(diào)用。這兩個方法執(zhí)行的過程中,系統(tǒng)會自動對視圖進行信息數(shù)據(jù)的存取,例如:ListView的滾動位置等等。(2)資源內(nèi)存不足導致低優(yōu)先級的Activity被殺死
當系統(tǒng)資源不足時,系統(tǒng)會按照上述優(yōu)先級去殺死目標的 Activity 所在的進程,并在后續(xù)通過 onSaveInstanceState 和 onRestoreInstanceState 來存儲和恢復數(shù)據(jù)。如果一些后臺的進程脫離了四大組件而獨立運行,那么這個進程很快就被殺死。我們常常將后臺工作放到 Service 中保持進程具有一定的優(yōu)先級。

圖4 configChanges添加orientation后的效果
當系統(tǒng)配置改變時Activity會銷毀重建,通過在AndroidMainManifest.xml中為Activity添加configChanges屬性去避免這個情況。configChanges的屬性有很多,例如:orientation表示屏幕方向變化、KeyboardHidden表示虛擬鍵盤可訪問性變化等,通過設(shè)置這些屬性后當運行過程中發(fā)生上述情況Activity既不會銷毀重建也不會調(diào)用 onSaveInstanceState 和 onRestoreInstanceState 兩個方法,而是執(zhí)行onConfigChanged方法。
問題: (1)onStart 和 onResume、onPause 和 onStop 從功能描述上看大同小異,到底有什么區(qū)別呢?
這兩組方法對的回調(diào)意義不同,onState 和onStop 是從 Activity 是否可見這個角度來回調(diào)的,而 onResume 和 onPause 是從 Activity 是否位于前臺這個角度來回調(diào)的,不過在實際使用中沒有其他明顯區(qū)別。
(2)假設(shè)當前Activity為A,如果這時用戶打開了一個新的Activity B,那么B的onResume方法和A的onPause方法誰先執(zhí)行呢?
根據(jù)Android的基本運行機制,不能在onPause中執(zhí)行重量級的操作,因為必須onPause執(zhí)行完成以后新Activity才能onResume。onPause和onResume都不能執(zhí)行耗時的操作,尤其是onPause,這就意味著我們應該在onStop中操作,從而使新的Activity顯示出來并切換到前臺。
到此這篇關(guān)于Android開發(fā)Activity的生命周期詳解的文章就介紹到這了,更多相關(guān)Android Activity 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PagerSlidingTabStrip制作Android帶標簽的多界面滑動切換
這篇文章主要介紹了使用PagerSlidingTabStrip制作Android帶標簽的多界面滑動切換效果的方法,PagerSlidingTabStrip是GitHub上的一個開源項目,調(diào)用這個庫可以少寫不少代碼XD 需要的朋友可以參考下2016-04-04
Android直播系統(tǒng)平臺搭建之圖片實現(xiàn)陰影效果的方法小結(jié)
這篇文章主要介紹了Android直播系統(tǒng)平臺搭建, 圖片實現(xiàn)陰影效果的若干種方法,本文給大家?guī)砣N方法,每種方法通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下2021-08-08
Android開發(fā)之模仿微信打開網(wǎng)頁的進度條效果(高仿)
這篇文章主要介紹了Android開發(fā)之模仿微信打開網(wǎng)頁的進度條效果(高仿)的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2016-07-07
Input系統(tǒng)之InputReader處理按鍵事件詳解
這篇文章主要為大家介紹了Input系統(tǒng)之InputReader處理按鍵事件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-11-11
java,Android:在eclipse中的快捷鍵(經(jīng)典收藏)
下面的快捷鍵是常用的,本人就本身喜好且常用的收拾一下,現(xiàn)在曬出來與大家分享,感興趣的朋友可以了解小哦2013-01-01
Android實現(xiàn)語音數(shù)據(jù)實時采集、播放
這篇文章主要介紹了android實現(xiàn)語音數(shù)據(jù)實時采集、播放的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-12-12
Android中判斷有無可用網(wǎng)絡(luò)的代碼(是否是3G或者WIFI網(wǎng)絡(luò))
在android開發(fā)中經(jīng)常會遇到的判斷有無可用網(wǎng)絡(luò)的代碼,防止客戶流量損失2013-01-01

