Activity生命周期

activity的生命周期如圖所示:
image.png
  • protected void onCreate(Bundle savedInstanceState):Activity被創(chuàng)建時調(diào)用
  • protected void onStart():Activity被創(chuàng)建或者從后臺回到前臺時調(diào)用
  • protected void onRestart():Activity從后臺回到前臺時調(diào)用
  • protected void onResume():Activity創(chuàng)建或者或者從被覆蓋惦蚊、后臺重新回到前臺時調(diào)用(界面就可見了溺拱,用戶就可以看到界面了怔锌。)
  • protected void onPause():Activity被覆蓋或者鎖屏時被調(diào)用
  • protected void onStop():Activity跳轉(zhuǎn)到新的Activity或者退出時調(diào)用
  • protected void onDestroy():Activity退出時調(diào)用

一、常見的生命周期過程:

1宋距、啟動Activity:系統(tǒng)會先調(diào)用onCreate方法轴踱,然后調(diào)用onStart方法,最后調(diào)用onResume谚赎,Activity進入運行狀態(tài)寇僧。
2、當前Activity被其他Activity覆蓋其上或被鎖屏:系統(tǒng)會調(diào)用onPause方法沸版,暫停當前Activity的執(zhí)行嘁傀。
3、當前Activity由被覆蓋狀態(tài)回到前臺或解鎖屏:系統(tǒng)會調(diào)用onResume方法视粮,再次進入運行狀態(tài)细办。
4、當前Activity轉(zhuǎn)到新的Activity界面或按Home鍵回到主屏蕾殴,自身退居后臺:系統(tǒng)會先調(diào)用onPause方法笑撞,然后調(diào)用onStop方法,進入停滯狀態(tài)钓觉。
5茴肥、用戶后退回到此Activity:系統(tǒng)會先調(diào)用onRestart方法,然后調(diào)用onStart方法荡灾,最后調(diào)用onResume方法瓤狐,再次進入運行狀態(tài)。
6批幌、當前Activity處于被覆蓋狀態(tài)或者后臺不可見狀態(tài)础锐,即第2步和第4步,系統(tǒng)內(nèi)存不足荧缘,殺死當前Activity皆警,而后用戶退回當前Activity:再次調(diào)用onCreate()、onStart()截粗、onResume()信姓,進入運行狀態(tài)。
7绸罗、用戶退出當前Activity:系統(tǒng)先調(diào)用onPause()意推,然后調(diào)用onStop(),最后調(diào)用onDestory()从诲,結(jié)束當前Activity左痢。

二、一個Activity的啟動完整生命周期。
1、 onCreate()--onStart()--onResume()--(點擊屏幕返回鍵后)--onPause()--onStop()--onDestroy()。
2实蔽、 onCreate()--onStart()--onResume()--(點擊屏幕HOME鍵后)--onPause()--onStop()(由桌面重新打開程序后)--onRestart()--onStart()--onResume()兽埃。
三、兩個Activity交互的生命周期?
1、ActivityA界面打開ActivityB logcat日志:

image.png
從A界面跳轉(zhuǎn)到B界面時,A的生命周期: onCreate()-->onStart()-->onResume()-->onPause(),然后B的生命周期onCreate()-->onStart()-->onResume()杭煎,B界面可見后,A界面繼續(xù)調(diào)用onStop()處于后臺不可見狀態(tài)卒落。

2羡铲、從ActivityB界面點擊返回按鈕到ActivityA:
image.png

在B界面點擊返回按鈕后,B界面首先調(diào)用onPause(),然后A界面生命周期onRestart()-->onStart()-->onResume(),A界面可見后儡毕,B界面繼續(xù)從onPause()到onStop()--->onDestroy()銷毀也切。

3、從A界面跳轉(zhuǎn)到B界面腰湾,B是透明主題雷恃。

image.png
A界面生命周期: onCreate()-->onStart()-->onResume()-->onPause()
B界面生命周期:onCreate()-->onStart()-->onResume()
A界面不會調(diào)用onStop()方法
4费坊、從透明主題B返回到A界面時倒槐。
image.png
透明主題B界面返回到A界面時,首先B會調(diào)用onPause()方法附井。A界面onResume()方法后讨越,B界面繼續(xù)走完周期onStop()-->onDestroy()。因為A界面沒有調(diào)用onStop()方法羡忘,所有不會調(diào)用onRestart()和onStart()方法谎痢。

四磕昼、Activity橫豎屏切換。

activity啟動后由豎屏切換到橫屏的生命周期:
onCreate()-->onStart()-->onResume()(顯示界面后切換到橫屏)-->onPause()-->onStop()-->onDestroy()-->onCreate()-->onStart()-->onResume().
在橫豎屏切換的時候為了保證界面的數(shù)據(jù)或者狀態(tài)時票从,android為我們提供了onSaveInstanceState(Bundle outState)onRestoreInstanceState(Bundle savedInstanceState)用于保存和恢復數(shù)據(jù)漫雕。

1、onSaveInstanceState(Bundle outState)在什么時機會被調(diào)用呢峰鄙?
當activity有可能被系統(tǒng)回收的情況下浸间,而且是在onStop()之前。注意是有可能吟榴,如果是已經(jīng)確定會被銷毀魁蒜,比如用戶按下了返回鍵,或者調(diào)用了finish()方法銷毀activity,則onSaveInstanceState不會被調(diào)用兜看∽断蹋或者也可以說,此方法只有在activity被異常終止的情況下會被調(diào)用细移。

onSaveInstanceState(Bundle outState)會在以下情況被調(diào)用:
①搏予、當用戶按下HOME鍵時。
②弧轧、從最近應用中選擇運行其他的程序時雪侥。
③、按下電源按鍵(關(guān)閉屏幕顯示)時精绎。
④速缨、從當前activity啟動一個新的activity時。
⑤代乃、屏幕方向切換時(無論豎屏切橫屏還是橫屏切豎屏都會調(diào)用)鸟廓。
在前4種情況下,當前activity的生命周期為:
onPause -> onSaveInstanceState -> onStop襟己。
(這個是我測試的結(jié)果引谜,但是根據(jù)《Android開發(fā)藝術(shù)探索》,說onPause和onSaveInstanceState的順序是不一定的)

2擎浴、onRestoreInstanceState什么時機被調(diào)用员咽?

onRestoreInstanceState(Bundle savedInstanceState)只有在activity確實是被系統(tǒng)回收,重新創(chuàng)建activity的情況下才會被調(diào)用贮预。

比如第5種情況屏幕方向切換時贝室,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onDestroy -> onCreate -> onStart -> onRestoreInstanceState -> onResume
在這里onRestoreInstanceState被調(diào)用,是因為屏幕切換時原來的activity確實被系統(tǒng)回收了仿吞,又重新創(chuàng)建了一個新的activity滑频。

而按HOME鍵返回桌面,又馬上點擊應用圖標回到原來頁面時唤冈,activity生命周期如下:
onPause -> onSaveInstanceState -> onStop -> onRestart -> onStart -> onResume
因為activity沒有被系統(tǒng)回收峡迷,因此onRestoreInstanceState沒有被調(diào)用。

如果onRestoreInstanceState被調(diào)用了你虹,則頁面必然被回收過绘搞,則onSaveInstanceState必然被調(diào)用過。

3傅物、onCreate()里也有Bundle參數(shù)夯辖,可以用來恢復數(shù)據(jù),它和onRestoreInstanceState有什么區(qū)別董饰?

因為onSaveInstanceState 不一定會被調(diào)用蒿褂,所以onCreate()里的Bundle參數(shù)可能為空圆米,如果使用onCreate()來恢復數(shù)據(jù),一定要做非空判斷啄栓。
而onRestoreInstanceState的Bundle參數(shù)一定不會是空值榨咐,因為它只有在上次activity被回收了才會調(diào)用。
而且onRestoreInstanceState是在onStart()之后被調(diào)用的谴供。有時候我們需要onCreate()中做的一些初始化完成之后再恢復數(shù)據(jù)块茁,用onRestoreInstanceState會比較方便。下面是官方文檔對onRestoreInstanceState的說明:
This method is called after onStart() when the activity is being re-initialized from a previously saved state, given here in savedInstanceState. Most implementations will simply use onCreate(Bundle) to restore their state, but it is sometimes convenient to do it here after all of the initialization has been done or to allow subclasses to decide whether to use your default implementation.

注意這個說明的最后一句是什么意思桂肌?
to allow subclasses to decide whether to use your default implementation.

它是說数焊,用onRestoreInstanceState方法恢復數(shù)據(jù),你可以決定是否在方法里調(diào)用父類的onRestoreInstanceState方法崎场,即是否調(diào)用super.onRestoreInstanceState(savedInstanceState);
而用onCreate()恢復數(shù)據(jù)佩耳,你必須調(diào)用super.onCreate(savedInstanceState);否則會報錯。

Activity橫豎屏設(shè)置
方式1:AndroidManifest.xml
<activity android:name="MainActivity" android:screenOrientation="landscape" /> // 或者 “portrait”
方式2:代碼實現(xiàn)
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);

獲取橫屏方向
int orientation = this.getResources().getConfiguration().orientation;
orientation 的常用取值可以為
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE(橫屏)ActivityInfo.SCREEN_ORIENTATION_PORTRAIT(豎屏)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末谭跨,一起剝皮案震驚了整個濱河市干厚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌螃宙,老刑警劉巖蛮瞄,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異谆扎,居然都是意外死亡挂捅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門堂湖,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闲先,“玉大人,你說我怎么就攤上這事无蜂∷趴罚” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵斥季,是天一觀的道長训桶。 經(jīng)常有香客問我,道長泻肯,這世上最難降的妖魔是什么渊迁? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮灶挟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘毒租。我一直安慰自己稚铣,他們只是感情好箱叁,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著惕医,像睡著了一般耕漱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上抬伺,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天螟够,我揣著相機與錄音,去河邊找鬼峡钓。 笑死妓笙,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的能岩。 我是一名探鬼主播寞宫,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼拉鹃!你這毒婦竟也來了辈赋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膏燕,失蹤者是張志新(化名)和其女友劉穎钥屈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體坝辫,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡焕蹄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了阀溶。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片腻脏。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖银锻,靈堂內(nèi)的尸體忽然破棺而出永品,到底是詐尸還是另有隱情,我是刑警寧澤击纬,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布鼎姐,位于F島的核電站,受9級特大地震影響更振,放射性物質(zhì)發(fā)生泄漏炕桨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一肯腕、第九天 我趴在偏房一處隱蔽的房頂上張望献宫。 院中可真熱鬧,春花似錦实撒、人聲如沸姊途。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捷兰。三九已至立叛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贡茅,已是汗流浹背秘蛇。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留顶考,地道東北人赁还。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像村怪,于是被迫代替她去往敵國和親秽浇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

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