Activity的生命週期分析
將Activity的生命週期分爲兩部分:android
一、典型狀況下的生命週期
正常狀況系,Activity會經歷以下生命週期:學習
- onCreate:表示Activity正在被建立
- onRestart:表示Activity正在被從新啓動
- onStart:表示Activity正在被啓動,這時已經可見,但沒有出如今前臺沒法進行交互
- onResume:表示Activity已經可見,而且處於前臺
- onPause:表示Activity正在中止(可作一次保存狀態中止動畫等非耗時操做)
- onStop:表示Activity即將中止(可進行重量級回收工做)
- onDestroy:表示Activity即將被銷燬
附加說明: 針對某一Activity:動畫
- 第一次啓動:onCreate->onStart->onResume;
- 打開新的Activity或者返回桌面:onPause->onStop。若是打開新的Activity爲透明主題,則不會調用onStop;
- 當回到原來Activity時:onRestart->onStart->onResume;
- 當按下返回鍵:onPause->onStop->onDestroy
當從A啓動B時: onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)code
二、異常狀況下的生命週期
這裏的異常狀況主要分爲兩種:blog
資源相關的系統配置文件發生改變致使Activity被殺死並重建
例如橫豎屏切換:當系統配置發生改變後生命週期
- Activity就會被銷燬(onPause->onStop->onDestroy依次調用);
- 。因爲是在異常狀況下終止的,因此係統會調用onSaveInstanceState保存當前Activity狀態。<u>onSaveInstanceState在onStop以前調用,跟onPasue沒有時序關係</u>;
- 當Activity被從新建立後,系統會調用onRestoreInstanceState(在onStart以前調用),並把onSaveInstanceState中保存的Bundle做爲參數傳遞給onCreate和onRestoreInstanceState
正常狀況下Activity不會調用onSaveInstanceState和onRestoreInstanceState,能夠根據onRestoreInstanceState來判斷Activity是否被重建。 Activity會爲咱們自動作一些恢復工做,例如當前視圖結構和數據(文本框用戶輸入數據,ListView滾動位置)內存
當Activity被異常銷燬時,咱們能夠在onSaveInstanceState保存一些數據,而後等Activity重建在onCreate裏或者onRestoreInstanceState獲取狀態信息。兩者的區別是:onCreate正常啓動時,其參數Bundle可能爲空,而onRestoreInstanceState一旦被調用,Bundle一定不爲空。資源
內存資源不足致使低優先級的Activity被殺死
Activity按照優先級大體分爲三種:get
- 前臺Activity:正在和用戶交互的Activity,優先級最高;
- 可見但非前臺(可見但不可交互):例如Activity中有彈窗,沒法進行交互;
- 後臺Activity:已經執行過onStop的Activity
當系統內存不足時,系統會按照上述優先級去殺死目標Activity,並經過後續的onSaveInstanceState和onRestoreInstanceState來存儲和恢復數據。it
Activity的四種啓動模式
- standard:標準模式,也是默認模式。每次啓動都會建立一個全新的實例。
- singleTop:棧頂複用模式。這種模式下若是Activity位於棧頂,不會新建實例。onNewIntent會被調用,接收新的請求信息,不會再低啊用onCreate和onStart。
- singleTask:棧內複用模式。升級版singleTop,若是棧內有實例,則複用,並會將該實例之上的Activity所有清除。
- singleInstance:系統會爲它建立一個單獨的任務棧,而且這個實例獨立運行在一個 task中,這個task只有這個實例,不容許有別的Activity 存在(能夠理解爲手機內只有一個)
指定啓動模式的方法
在AndroidMenifest裏指定啓動模式
<activity android:name=".singletop.SingleTopActivity" android:launchMode="singleTop">
經過Intent中設置flag指定啓動模式
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TASK);
![](http://static.javashuo.com/static/loading.gif)
今年金九銀十我花一個月的時間收錄整理了一套知識體系,若是有想法深刻的系統化的去學習的,能夠點擊傳送門,我會把我收錄整理的資料都送給你們,幫助你們更快的進階。
![](http://static.javashuo.com/static/loading.gif)