Activity生命周期全面總結(jié)

前言

Android的生命周期相對來說是比較基礎(chǔ)的知識點袁铐,但卻是非常重要的糖耸。精準的掌握并熟練地使用會讓我們的代碼更有邏輯性且更加健壯。我們都知道人的記憶是曲線的枢步,只有不斷地回顧沉删,不斷地溫習(xí),這樣在我們拿出來用的時候不至于出現(xiàn)間斷性的記憶空白醉途。

正文

我們今天來系統(tǒng)的總結(jié)一下Android的生命周期矾瑰,比如正常狀況下的生命周期,以及非正常狀態(tài)下的生命周期结蟋。比如旋轉(zhuǎn)屏幕時的生命周期以及異常情況下如何保存Activity的狀態(tài)脯倚。先讓我們來看一下官方給出的圖解:

Android的生命周期

呀渔彰!有點看不懂嵌屎。沒關(guān)系,我剛開始也沒看懂恍涂,讓我們看不同操作生命周期的流程宝惰,寫幾個小Demo,相信我們回過頭來再看就清晰多了再沧。讓我們來新建一個工程ActivityTest來驗證一下每個流程尼夺。


public class MainActivity extends AppCompatActivity {

    private static final String TAG = "ActivityTest";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Log.d(TAG, "---onCreate()---");

    }

    @Override
    protected void onStart() {
        super.onStart();
        Log.d(TAG, "---onStart()---");
    }

    @Override
    protected void onRestart() {
        super.onRestart();
        Log.d(TAG, "---onRestart()---");
    }

    @Override
    protected void onResume() {
        super.onResume();
        Log.d(TAG, "---onResume()---");

    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.d(TAG, "---onPause()---");
    }

    @Override
    protected void onStop() {
        super.onStop();
        Log.d(TAG, "---onStop()---");
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "---onDestroy()---");
    }
    
}
我們先看一下七個方法的作用,然后再來分析一下不同情況的流程:
  • onCreate()??表示Activity正在被創(chuàng)建
  • onRestart()??Activity正在重新啟動
  • onStart()???activity變?yōu)樵谄聊簧蠈τ脩艨梢姇r調(diào)用
  • onResume()??開始與用戶交互時調(diào)用
  • onPause()???Activity正在停止炒瘸,失去焦點
  • onStop()???Activity即將停止淤堵,且處于不可見狀態(tài)
  • onDestory()??Activity正在被銷毀

正常情況

第一次啟動一個Activity

依次調(diào)用:onCreate-->onStart-->onResum 讓我們來看一下Log。

當(dāng)我們點擊Back退回到桌面

依次調(diào)用:onPause-->onStop-->onDestory 讓我們來看一下Log顷扩。


當(dāng)我們點擊Home鍵返回桌面時

依次調(diào)用:onPause()-->onStop() 讓我們來看一下Log拐邪。



??注意當(dāng)我們點擊Home鍵退回到桌面時并沒有調(diào)用onDestory,因為此時Activity只是處于后臺不可見的狀態(tài)隘截,并沒有被銷毀扎阶。

當(dāng)我們從后臺切回到Activity時

依次調(diào)用onRestart-->onStart-->onResume 我們看一下log



??我們會發(fā)現(xiàn)并沒有調(diào)用onCreate,因為此前Activity處于停滯狀態(tài)婶芭,并沒有被銷毀所以不需要重新創(chuàng)建东臀。但是值得注意的是當(dāng)系統(tǒng)資源不足時會導(dǎo)致后臺Activity被殺死。當(dāng)Activity被殺死的時候犀农,你去啟動它你就會發(fā)現(xiàn)和第一次啟動它的生命周期是相同的惰赋。接下來我們看看非正常情況下的生命周期。

onWindowFocusChanged

在我們介紹它非正常情況的生命周期之前呵哨,我們先來看看它的onWindowFocusChanged()方法谤逼。這個onWindowFocusChanged指的是這個Activity得到或者失去焦點的時候會被調(diào)用,也許這么說不太好理解仇穗,我們可以認為他是Activity完全加載之后調(diào)用流部。
??啟動Activity



??退出Activity



??看Log信息我們會發(fā)現(xiàn)在啟動Activity和退出Activity時他都會調(diào)用。在啟動Activity時他是在onResume之后纹坐,也就是Activity獲得焦點之后枝冀。在退出Activity時他在onPause之后調(diào)用舞丛,此時Activity失去焦點,這也就驗證我們之前所述果漾。
??如果之前你寫過FrameAnimation你會發(fā)現(xiàn)球切,當(dāng)我們在onCreate內(nèi)start動畫時,Activity啟動了但并沒有動畫的效果绒障,如果你將start放在onWindowFocusChanged內(nèi)就會達到預(yù)期的效果了吨凑。這是因為在onCreate的時候Activity并沒有獲得焦點,而onWindowFocusChanged是在Activity獲得焦點之后調(diào)用户辱。

非正常情況

  • 屏幕旋轉(zhuǎn)





    ??當(dāng)屏幕旋轉(zhuǎn)的時候我們發(fā)現(xiàn)Activity先是被銷毀之后又被重建鸵钝。而且我們還發(fā)現(xiàn)雖然Activity被重建了,但是控件里的內(nèi)容還在庐镐,這是為什么呢恩商。
    ??這是因為當(dāng)Activity不是正常退出的時候,它不僅調(diào)用onPause必逆,onStop怠堪,onDestory,它會在調(diào)用onStop之前調(diào)用onSaveInstanceState這個方法來保存一些數(shù)據(jù)名眉,當(dāng)Activity重建的時候粟矿,這個方法所存儲的數(shù)據(jù)會以Bundle作為參數(shù)傳遞給onCreate,所以我們可以用參數(shù)來判斷這個Activity是新建的還是重建的损拢,如果是重建的陌粹,則可以從Bundle中取出數(shù)據(jù)來恢復(fù)界面。
    ??那我們可不可以不讓他銷毀并重新創(chuàng)建呢探橱?
    ??答案是肯定的申屹,你只需要在AndroidManifest文件中的對應(yīng)Activity中配置
    android:configChanges="keyboardHidden|orientation|screenSize",最好這三個都配置隧膏,否則不能適配所有機型或sdk版本哗讥。



    ??設(shè)置之后你會發(fā)現(xiàn)不會銷毀和重新創(chuàng)建了,只會調(diào)用onConfigurationChanged這一個方法胞枕,所以我們可以在里面做一些特殊的操作杆煞。

當(dāng)然如果你不想讓他旋轉(zhuǎn)就在AndroidManifest文件中的對應(yīng)Activity中配置android:screenOrientation=”landscape”(橫屏,portrait是豎屏)腐泻;

尾語

今天我們就先總結(jié)就先到這里决乎,相信你現(xiàn)在回個頭看官方圖解會有新的感覺,且對生命周期也有了一定的了解派桩。因為筆者水平有限构诚,如有紕漏或不足往指出,我一定會積極改正铆惑,希望我們一起進步吧范嘱。

注K蜕拧!丑蛤!

總結(jié)不易叠聋,請尊重勞動成果,轉(zhuǎn)載請標明出處受裹,謝謝B挡埂!棉饶!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厦章,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子砰盐,更是在濱河造成了極大的恐慌闷袒,老刑警劉巖坑律,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岩梳,死亡現(xiàn)場離奇詭異,居然都是意外死亡晃择,警方通過查閱死者的電腦和手機冀值,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宫屠,“玉大人列疗,你說我怎么就攤上這事±缩澹” “怎么了抵栈?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長坤次。 經(jīng)常有香客問我古劲,道長,這世上最難降的妖魔是什么缰猴? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任产艾,我火速辦了婚禮,結(jié)果婚禮上滑绒,老公的妹妹穿的比我還像新娘闷堡。我一直安慰自己,他們只是感情好疑故,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布杠览。 她就那樣靜靜地躺著,像睡著了一般纵势。 火紅的嫁衣襯著肌膚如雪踱阿。 梳的紋絲不亂的頭發(fā)上误续,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音扫茅,去河邊找鬼蹋嵌。 笑死,一個胖子當(dāng)著我的面吹牛葫隙,可吹牛的內(nèi)容都是我干的栽烂。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼恋脚,長吁一口氣:“原來是場噩夢啊……” “哼腺办!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起糟描,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤怀喉,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后船响,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體躬拢,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年见间,在試婚紗的時候發(fā)現(xiàn)自己被綠了聊闯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡米诉,死狀恐怖菱蔬,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情史侣,我是刑警寧澤拴泌,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站惊橱,受9級特大地震影響蚪腐,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜李皇,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一削茁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧掉房,春花似錦茧跋、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至哪亿,卻和暖如春粥烁,著一層夾襖步出監(jiān)牢的瞬間贤笆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工讨阻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留芥永,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓钝吮,卻偏偏與公主長得像埋涧,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子奇瘦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

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

  • 啟動與銷毀Activity 不同于使用 main() 方法啟動應(yīng)用的其他編程范例棘催,Android 系統(tǒng)會通過調(diào)用對...
    安卓Boy閱讀 1,765評論 3 5
  • 本篇博客是筆者看過《Android開發(fā)藝術(shù)探索》才寫的,有些是借鑒了此本書的內(nèi)容耳标,當(dāng)有些內(nèi)容進行了精進醇坝。 Acti...
    ClAndEllen閱讀 3,416評論 1 27
  • 高中的時候,我還會給同學(xué)寫信次坡,后來呼猪,我們每個人都有了手機、有了微信贸毕。 后來郑叠,她跟我說夜赵,收拾東西的時候明棍,重讀我寫給她...
    寫給自己的信閱讀 336評論 0 0
  • 概述 Android平臺上app的統(tǒng)計數(shù)據(jù)都是基于Android的設(shè)備信息的,比如首次使用(激活)寇僧,活躍(日活躍D...
    aimfaraway閱讀 20,937評論 13 81
  • 感恩父母養(yǎng)育之恩摊腋,感恩先生理解包容和支持并時時幫忙。 感恩客戶的理解和學(xué)校老師給予的方便嘁傀。 感恩朋友們和客戶們的口...
    李柯潔閱讀 119評論 0 3