一.各個(gè)生命周期解釋
(1) onCreate:表示Activity正在被創(chuàng)建,生命周期第一個(gè)方法,在此方法中做一些初始化工作蛙粘,比如調(diào)用setContentView加載布局資源牲平、初始化Activity所需數(shù)據(jù)等。
(2) onRestart:表示Activity正在重新啟動(dòng)陪每,當(dāng)前Activity從不可見重新變?yōu)榭梢姞顟B(tài),主要是發(fā)生在當(dāng)用戶打開一個(gè)新Activity扮授,此時(shí)會(huì)執(zhí)行當(dāng)前Activity的onPause()和onStop()方法兽埃,接著再回到當(dāng)前這個(gè)Activity的時(shí)候會(huì)執(zhí)行此方法哀峻,或者用戶在當(dāng)前Activity頁(yè)面按下Home鍵涡相,再回到這個(gè)Activity也會(huì)執(zhí)行該方法。
(3) onStart:表示Activity正在被啟動(dòng)剩蟀,此時(shí)Activity已經(jīng)可見了催蝗,但是還沒有出現(xiàn)在前臺(tái)我們還看不到,無法與其交互育特。
(4) onResume:表示Activity在已經(jīng)可見丙号,顯示在前臺(tái)并且可以與其交互,與onStart( )的時(shí)候都是可見,但是onStart的時(shí)候Activity是在后臺(tái)犬缨,onResume的時(shí)候才在前臺(tái)喳魏。
(5) onPause:表示Activity正在停止,正常情況下會(huì)接著調(diào)用onStop()方法遍尺,但是如果Activity采用透明主題則不會(huì)調(diào)onStop()方法截酷,可以做一些存儲(chǔ)數(shù)據(jù),停止動(dòng)畫等工作,但這個(gè)方法不能處理太耗時(shí)的操作涮拗,因?yàn)樾麓蜷_的Activity是在此Activity執(zhí)行完onPause之后才能執(zhí)行onResume()乾戏。
(6) onStop:表示Activity即將停止,可以做一些稍微重量級(jí)的回收工作三热,但不能太耗時(shí)鼓择。
(7) onDestory:表示Activity即將被銷毀了,這是Activity生命周期的最后一個(gè)回調(diào)方法就漾,可以執(zhí)行最終的回收和資源釋放工作呐能。
二.生命周期回調(diào)順序
(1).針對(duì)一個(gè)特定的Activity,第一次啟動(dòng),回調(diào)如下:onCreate->onStart->onResume.
(2).當(dāng)用戶打開新的Activity或者切換到桌面的時(shí)候,回調(diào)如下:onPause->onStop.
(特殊情況:如果新的Activity采用透明主題抑堡,回調(diào)僅為onPause)摆出。
(3).當(dāng)用戶再次回到原Activity時(shí),回調(diào)如下:onRestart->onStart->onResume.
(4).當(dāng)用戶按下back返回鍵時(shí)首妖,回調(diào)如下:onPause->onStop->onDestory.
(5).當(dāng)后臺(tái)Activity被系統(tǒng)回收后再次打開應(yīng)用,回調(diào)如下:onCreate->onStart->onResume.
(6).從整個(gè)生命周期來說偎漫,onCreate和onDestory是配對(duì)的,標(biāo)識(shí)著Activity的創(chuàng)建與銷毀有缆,在整個(gè)生命周期中僅調(diào)用一次象踊。onStart和onStop是配對(duì)的,標(biāo)識(shí)著Activity的可見棚壁,在整個(gè)生命周期中可調(diào)用多次杯矩。onResume和onPause是配對(duì)的,標(biāo)識(shí)著Activity是否位于前臺(tái)袖外,在整個(gè)生命周期中可調(diào)用多次史隆。
三.生命周期相關(guān)問題
(1).不能再onPause中做重量級(jí)的耗時(shí)操作,因?yàn)楸仨氃趏nPause執(zhí)行完成后新的Activity才能onResume顯示出來.
(2).當(dāng)系統(tǒng)配置發(fā)生變化后曼验,Activity會(huì)被銷毀逆害,而此Activity是在異常情況下終止的,系統(tǒng)會(huì)調(diào)用onSaveInstanceState來保存當(dāng)前Activity狀態(tài)蚣驼,這個(gè)方法調(diào)用時(shí)機(jī)是在onStop之前魄幕,它和onPause沒有既定的時(shí)序關(guān)系,有可能在前,也有可能在后颖杏。正常情況下系統(tǒng)不會(huì)調(diào)用onSaveInstanceState纯陨,只有在Activity異常終止的情況下才調(diào)用。
(3).在onSaveInstanceState和onRestoreInstanceState來存儲(chǔ)和恢復(fù)數(shù)據(jù)。如果選擇在onCreate中來恢復(fù)數(shù)據(jù)翼抠,一定要額外的判斷Bundle是否為空.(官方文檔建議使用onRestoreInstanceState來恢復(fù)數(shù)據(jù))咙轩。系統(tǒng)也會(huì)默認(rèn)為我們做一定的恢復(fù)工作,如保存當(dāng)前Activity的視圖結(jié)構(gòu)阴颖,文本框中輸入的數(shù)據(jù)活喊,ListView滾動(dòng)位置等。
(4).關(guān)于保存和恢復(fù)View的層次結(jié)構(gòu)量愧,系統(tǒng)工作流程是:Activity異常終止,Activity調(diào)用onSaveInstanceState去保存數(shù)據(jù)钾菊,然后Activity會(huì)委托Windows去保存數(shù)據(jù),接著Window再委托它上面的頂層容器去保存數(shù)據(jù)偎肃。頂層容器是一個(gè)ViewGroup煞烫,一般來說它很可能是DectorView,最后頂層容器再去通知它的子元素保存數(shù)據(jù)累颂。(這是一種委托思想滞详,上層委托下層,父容器委托子元素去處理事情紊馏,如View的繪制過程料饥,事件分發(fā)都是采用類似的思想)
(5).內(nèi)存不足會(huì)導(dǎo)致低優(yōu)先級(jí)的Activity被殺死:
? ? ①.后臺(tái)Activity優(yōu)先級(jí)最低,因?yàn)橐呀?jīng)執(zhí)行了onStop朱监,被暫停了岸啡。
? ? ②.可見單非前臺(tái)Activity,比如Activity中彈出一個(gè)對(duì)話框赌朋,導(dǎo)致Activity可見但位于后臺(tái)無法與用戶直接交互凰狞。
? ? ③.前臺(tái)Activity,正在和用戶交互的Activity沛慢。
備注:當(dāng)系統(tǒng)內(nèi)存不足時(shí)赡若,系統(tǒng)會(huì)按照上述優(yōu)先級(jí)去殺死目標(biāo)Activity所在的進(jìn)程,要在在onSaveInstanceState和onRestoreInstanceState來存儲(chǔ)和恢復(fù)數(shù)據(jù)团甲。如果一個(gè)進(jìn)程中沒有四大組件在執(zhí)行逾冬,很容易被系統(tǒng)殺死。解決方法一般是將后臺(tái)工作放入Service中從而保證該進(jìn)程有一定的優(yōu)先級(jí)躺苦,不會(huì)輕易被系統(tǒng)殺死身腻。
四.android:configChanges屬性
如果我們沒有給Activity指定configChanges屬性,當(dāng)配置發(fā)生變化后會(huì)導(dǎo)致Activity重新創(chuàng)建匹厘,常用的配置local嘀趟,keyboardHidden,orientation愈诚,screenSize她按。
local:設(shè)備的本地位置發(fā)生了變化牛隅,一般指切換了系統(tǒng)語言。
keyboardHidden:鍵盤的可訪問性發(fā)生了變化酌泰,不如用戶調(diào)出了鍵盤媒佣。
orientation:屏幕方向發(fā)生了變化,這個(gè)最常用陵刹,比如旋轉(zhuǎn)了手機(jī)屏幕默伍。
screenSize:屏幕的尺寸信息發(fā)生了變化,當(dāng)旋轉(zhuǎn)手機(jī)屏幕時(shí)衰琐,屏幕尺寸會(huì)發(fā)生變化也糊。
? ? ①.不設(shè)置Activity的android:configChanges時(shí),切屏?xí)匦抡{(diào)用各個(gè)生命周期碘耳,切橫屏?xí)r會(huì)執(zhí)行一次显设,切豎屏?xí)r會(huì)執(zhí)行兩次框弛。
? ? ②.設(shè)置Activity的android:configChanges="orientation"時(shí)辛辨,切屏還是會(huì)重新調(diào)用各個(gè)生命周期,切橫瑟枫、豎屏?xí)r只會(huì)執(zhí)行一次
? ? ③.設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時(shí)斗搞,切屏不會(huì)重新調(diào)用各個(gè)生命周期,只會(huì)執(zhí)行onConfigurationChanged方法
但是慷妙,自從Android 3.2(API 13)僻焚,在設(shè)置Activity的android:configChanges="orientation|keyboardHidden"后,還是一樣會(huì)重新調(diào)用各個(gè)生命周期的膝擂。因?yàn)閟creen size也開始跟著設(shè)備的橫豎切換而改變虑啤。所以,在AndroidManifest.xml里設(shè)置的MiniSdkVersion和 TargetSdkVersion屬性大于等于13的情況下架馋,如果你想阻止程序在運(yùn)行時(shí)重新加載Activity狞山,除了設(shè)置"orientation", 你還必須設(shè)置"ScreenSize"叉寂。
五.Activity生命周期圖
總結(jié):
本文對(duì)Android的Activity生命周期進(jìn)行了整理與介紹萍启,是對(duì)Android開發(fā)進(jìn)階要點(diǎn)進(jìn)行整理,持續(xù)整理更多Android的知識(shí)與系統(tǒng)工作機(jī)制屏鳍。
部分內(nèi)容均來源網(wǎng)上 與《Android開發(fā)藝術(shù)探索》一書勘纯。
如有相關(guān)問題可聯(lián)系作者:weixidream@gmail.com