activity生命周期(二)

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

正常情況下的生命周期

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種:

  1. 前臺activity——優(yōu)先級最高
  2. 可見但非前臺activity——優(yōu)先級次高
  3. 后臺activity(不可見)——執(zhí)行了onStop方法,優(yōu)先級最低

當內(nèi)存不足時,系統(tǒng)會按照優(yōu)先級的高低去殺死目標activity所在的進程,如果一個進程中沒有四大組件在執(zhí)行,那么這樣的進程很容易被殺死,一般比較好的方法是將后臺工作放在四大組件中的Service中從而保證了進程有了一定的優(yōu)先級,就不會輕易被系統(tǒng)給殺死了。

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容