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生命周期都該做哪些事情试躏?