- activity的生命周期分兩種情況,一種的正常情況下的生命周期,一種是異常情況下的生命周期,而異常情況通常是指activity被系統(tǒng)回收或者系統(tǒng)配置發(fā)生改變而導致activity被銷毀重建,比如屏幕的翻轉。
正常情況下的生命周期

一個activity有四種狀態(tài),7個方法。四種狀態(tài)是運行、暫停、停止、不存在狀態(tài),7個方法是:
- onCreate():表示activity正在創(chuàng)建,此時系統(tǒng)內(nèi)存中有activity的實例,這是生命周期中的第一個方法,在這個方法中我們可以做一些初始化,比如使用setContentView()去加載界面布局資源,初始化activity所需要的數(shù)據(jù)。
- onRestart():表示activity重新啟動,當activity停止后但并沒有銷毀時再次啟動時,也就是當activity由不可見狀態(tài)變?yōu)榭梢姞顟B(tài)時,就會調(diào)用這個方法。
- onStart():表示activity正在被啟動,這時候的activity就可見了,但是卻不能操作,不能與用戶進行交互。
- onResume():表示activity已經(jīng)可見并且可以在前臺和用戶進行交互了,這與上面的onStart()方法的相同之處就是都可見,不同之處就是onStart()中activity是不在前臺的,不能與用戶進行交互,而在onResume()中,activity是在前臺的,可以與用戶進行交互。
- onPause():表示暫停activity,一般在正常的情況下,緊接著會調(diào)用onStop()方法,這時activity又變?yōu)榭梢姷荒芙换サ那闆r了,與onResume()是相對應的。
- onStop():表示停止activity,這時activity會變?yōu)椴豢梢姷臓顟B(tài),但是activity的實例還在系統(tǒng)內(nèi)存中的,在這個方法中,我們可以做一些輕量級的回收工作,不能做一些耗時的事情。
- onDestroy():表示activity正在被銷毀,這時activity即不可見并且系統(tǒng)內(nèi)存中也沒有了activity的實例了,這時activity生命周期中的最后一個回調(diào),在這里,我們可以做一些自愿的額釋放和回收工作。
activity的啟動原理:啟動一個activity的請求會由Instrumentation來處理,然后它通過Binder向AMS(ActivityManagerService)發(fā)送請求,AMS內(nèi)部維護著一個ActivityStack并負責棧內(nèi)的Activity的狀態(tài)同步,AMS通過ActivityThread去同步activity的狀態(tài)從而完成生命周期方法的調(diào)用。
異常情況下的生命周期
activity除了正常情況下的生命周期,還有異常情況的下的生命周期,其生命周期與正常生命周期有些許的不一樣。從以下兩種情況分析異常情況下的生命周期:
資源相關的系統(tǒng)配置發(fā)生改變導致activity被殺死并重建
比如在橫豎屏切換的時候,由于資源要重新配置,在默認的情況下,activity會被銷毀并且重建。
當系統(tǒng)配置發(fā)生改變后,activity會被摧毀,其中會調(diào)用onPause、onStop、onDestroy方法,同時,由于activity是異常終止的,系統(tǒng)會調(diào)用onSaveInstanceState來保存當前activity的狀態(tài),這個方法在onStop之前調(diào)用,既可以在onPause之前調(diào)用。也可以在onPause之后調(diào)用,這個方法只出現(xiàn)在activity異常終止的情況下,當activity又重新創(chuàng)建后,系統(tǒng)又會調(diào)用onRestoreInstanceState,并且將onSaveInstanceState保存的Bundle對象作為參數(shù)傳遞給onRestoreInstanceState方法和onCreate()方法,通過后面這兩個方法可以判斷activity是否被重建了,如果是重新建立的,那么Bundle對象就不為空,如果是新建的activity,那么Bundle對象就為null,重建的onRestoreInstanceState方法調(diào)用在onStart方法之后。在activity正常銷毀的時候是不會調(diào)用onSaveInstanceState方法的,只有在activity異常終止并重建的時候才調(diào)用onSaveInstanceState和onRestoreInstanceState來存儲和恢復數(shù)據(jù)。
- 如果當系統(tǒng)的資源配置發(fā)生改變時,不想重建activity,可以在AndroidMenifest.xml文件中給activity聲明屬性:
android:configchanges="orientation"
保存和恢復View層次結構,系統(tǒng)的工作流程
- activity異常終止時,系統(tǒng)調(diào)用onSaveInstanceState方法去保存數(shù)據(jù)
- 然后activity委托window去保存數(shù)據(jù)
- 接著window再委托它上面的頂級容器去保存數(shù)據(jù),(頂級容器是一個ViewGroup)
- 頂級容器再通知子元素去保存數(shù)據(jù)
2.資源內(nèi)存不足導致低優(yōu)先級的activity被殺死
activity的優(yōu)先級由高到低可以分為3種:
- 前臺activity——優(yōu)先級最高
- 可見但非前臺activity——優(yōu)先級次高
- 后臺activity(不可見)——執(zhí)行了onStop方法,優(yōu)先級最低
當內(nèi)存不足時,系統(tǒng)會按照優(yōu)先級的高低去殺死目標activity所在的進程,如果一個進程中沒有四大組件在執(zhí)行,那么這樣的進程很容易被殺死,一般比較好的方法是將后臺工作放在四大組件中的Service中從而保證了進程有了一定的優(yōu)先級,就不會輕易被系統(tǒng)給殺死了。