Android Note - Activity生命周期

Android生命周期官方示意圖

上圖是官方示意圖,將整個生命周期分為6個部分

  • Created 首次創(chuàng)建并被初始化,整個生命周期中只調(diào)用一次
  • Started 初始化完成,用戶此時已經(jīng)可以看到Activity窗口,但并不能交互
  • Resumed 完成創(chuàng)建番电,此時可以與用戶進行交互
  • Paused 失去焦點,此時不可與用戶進行交互
  • Stopped 處于用戶不可見狀態(tài),但并沒有被銷毀
  • Destoryed 被系統(tǒng)銷毀漱办,釋放資源

回調(diào)函數(shù)


Activity的生命周期是由framework層的ActivityServiceManager控制的这刷,用戶并不能控制Activity的生命周期,但是可以通過Activity生命周期變化的幾個回調(diào)方法來影響并管理Activity生命周期

  • onCreate()
    • 新建Activity的回調(diào)方法娩井,只有當Task棧中沒有對應(yīng)的Activity時才調(diào)用該方法
    • 此回調(diào)方法會默認調(diào)用一個名為savedInstanceState的Bundler對象(該對象在內(nèi)存中)暇屋,并通過檢測該對象是否為null來判斷是否創(chuàng)建新的實例或恢復(fù)被Destroy的Activity對象
    • 必須調(diào)用父類的onSaveInstanceState()才能恢復(fù)Activity的狀態(tài)信息
  • onStart()
    • 初始化完成后的回調(diào)方法,用戶此時可以看到Activity的界面洞辣,但不能進行交互操作
    • 此回調(diào)方法中的操作與onStop()方法對應(yīng)咐刨,即在onStop()中釋放了哪些資源,就要在onStart()方法中重新創(chuàng)建
    • 在此回調(diào)方法之后有一個方法onRestoreInstanceState()可以恢復(fù)Activity的狀態(tài)信息
  • onResume()
    • 啟動或重新啟動Activity完成后的回調(diào)方法扬霜,此時用戶可以進行交互
  • onPause()
    • Activity失去焦點后的回調(diào)方法定鸟,此時界面可見,但是無法交互 - 在此回調(diào)方法中可以保存數(shù)據(jù)到緩存中(并非寫入數(shù)據(jù)庫或者文件)畜挥,停止animation,釋放GPS婴谱、Camera等資源蟹但。注意在onPause()中避免進行耗費CPU資源的操作
  • onRestart()
    • 重新啟動Activity時的回調(diào)方法,該方法中會直接執(zhí)行start方法
  • onStop()
    • Activity不可見時的回調(diào)方法谭羔,用戶此時已經(jīng)看不到Activity的界面华糖,但是Activity本身未被銷毀
    • 因為系統(tǒng)在內(nèi)存緊張時,可能會在調(diào)用onDestory()方法之前就銷毀Activity所以在onStop()回調(diào)方法中釋放資源瘟裸,防止內(nèi)存泄漏客叉。此外對于耗費CPU資源的操作,如保存數(shù)據(jù)到數(shù)據(jù)庫或文件中也可以在該回調(diào)方法中操作
    • 該回調(diào)方法中系統(tǒng)也會默認調(diào)用onSaveInstanceState()方法话告,保存Activity的狀態(tài)信息
  • onDestory()
    • Activity被移出Task棧兼搏,并被系統(tǒng)銷毀

常見場景的分析


  • 啟動Activity
    當系統(tǒng)得到啟動一個Activity的請求時,會到當前進程的ActivityTask棧中尋找對應(yīng)的Activity沙郭;如果沒有找到則創(chuàng)建該Activity佛呻。會依次調(diào)用onCreate() -> onStart() -> onResume() 進入Resumed狀態(tài)
啟動Activity
  • 銷毀Activity
    當Activity從Task棧被退出時,啟動銷毀流程病线;如果本身處于Stopped狀態(tài)吓著,則直接調(diào)用onDestroy()銷毀;如果處于Resumed狀態(tài)送挑,則會依次調(diào)用onPause() -> onStop() -> onDestroy() 進入Destroyed狀態(tài)
銷毀Activity
  • 在Activity A基礎(chǔ)上啟動新Activity B
    因為啟動B绑莺,A要從Resume的狀態(tài)變?yōu)镾topped狀態(tài),依次調(diào)用onPause() -> onStop()惕耕;而B依然按照正常啟動的方式依次調(diào)用onCreate() -> onStart() -> onResume()纺裁;但是A只有在B啟動完畢進入Resumed狀態(tài)后才會進入Stopped狀態(tài),所以對于A與B整個時間序列上司澎,是如下表的形式
在Activity A基礎(chǔ)上啟動新Activity B
  • 將Activity B彈出并還原Activity A(假定A未被銷毀)
    B被Task棧彈出对扶,所以要被銷毀至Destroyed狀態(tài)区赵;而A此時處于Stopped狀態(tài),要切換至Resumed狀態(tài)浪南,依次調(diào)用onRestart() -> onStart() -> onResume()笼才;同理,B會先進入Paused狀態(tài)络凿,等A Resume完成后才進入Stopped狀態(tài)骡送。時間序列如下
將Activity B彈出并還原Activity A(假定A未被銷毀)
  • 彈出與關(guān)閉對話框
    當彈出對話框時,Activity在視圖上可見但處于失去焦點的狀態(tài)絮记,即Paused摔踱;所以此時Activity會調(diào)用onPause()方法;當對話框被關(guān)閉時怨愤,Activity會調(diào)用onResume()方法重新獲取焦點
彈出與關(guān)閉對話框

屏幕旋轉(zhuǎn)


如果未配置Manifest中的android:configChanges派敷,則在切換橫豎屏時Activity的生命周期將重新開始,會調(diào)用onCreate()撰洗,生命周期重新開始
如果配置Manifest中的android:configChanges="keyboardHidden|orientation|screenSize"篮愉,則將調(diào)用onConfigurationChanged,并且不會調(diào)用onCreate()差导,而是直接從onStart()開始調(diào)用

參考資料


Android生命周期
Android Activity生命周期都該做哪些事情试躏?


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市设褐,隨后出現(xiàn)的幾起案子颠蕴,更是在濱河造成了極大的恐慌,老刑警劉巖助析,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件犀被,死亡現(xiàn)場離奇詭異,居然都是意外死亡外冀,警方通過查閱死者的電腦和手機弱判,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锥惋,“玉大人昌腰,你說我怎么就攤上這事“虻” “怎么了遭商?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長捅伤。 經(jīng)常有香客問我劫流,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任祠汇,我火速辦了婚禮仍秤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘可很。我一直安慰自己诗力,他們只是感情好,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布我抠。 她就那樣靜靜地躺著苇本,像睡著了一般。 火紅的嫁衣襯著肌膚如雪菜拓。 梳的紋絲不亂的頭發(fā)上瓣窄,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天,我揣著相機與錄音纳鼎,去河邊找鬼俺夕。 笑死,一個胖子當著我的面吹牛贱鄙,可吹牛的內(nèi)容都是我干的劝贸。 我是一名探鬼主播,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼贰逾,長吁一口氣:“原來是場噩夢啊……” “哼悬荣!你這毒婦竟也來了菠秒?” 一聲冷哼從身側(cè)響起疙剑,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎践叠,沒想到半個月后言缤,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡禁灼,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年管挟,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弄捕。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡僻孝,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出守谓,到底是詐尸還是另有隱情穿铆,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布斋荞,位于F島的核電站荞雏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凤优,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一悦陋、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筑辨,春花似錦俺驶、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至痢毒,卻和暖如春送矩,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哪替。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工栋荸, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人凭舶。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓晌块,卻偏偏與公主長得像,于是被迫代替她去往敵國和親帅霜。 傳聞我的和親對象是個殘疾皇子匆背,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

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