Activity的生命周期總結(jié)

關(guān)于Activity的生命周期,主要得掌握:
1、在不同情況下,生命周期的變化過程。主要有:
1)橫豎屏切換
2)A-->B,B是透明的/dialog。
2、onConfigurationChanged、onSaveInstanceState、onNewIntent的使用場景。
以后復習重點看就第二/第三節(jié),把其中提出的問題都掌握。

一、 生命周期

1.1 生命周期圖片
Activity生命周期官方圖片
回調(diào)方法 方法說明
onCreate() 不可見。加載視圖,綁定事件。
onStart() 不可見 → 可見。
onResume() 可交互。棧頂,運行狀態(tài)。
onPause() 可見。保存數(shù)據(jù)。釋放資源。
onStop() 不可見。
onDestory() 銷毀,出棧。
onRestart() 停止 → 運行,之前回調(diào)。
1.2 回調(diào)方法與生存期的對應(yīng)關(guān)系

除了onRestart(),生命周期兩兩相對,可分為3種生存期。

  • 完整生存期
    onCreate() → onDestory()。
  • 可見生存期
    onStart → onStop()。
  • 前臺生存期
    onResume() → onPause()。

二、 幾種常見的回調(diào)總結(jié)

常見操作 回調(diào)步驟
跳轉(zhuǎn) FirstActivity:onPause()
SecondActivity: → onCreate() → onStart() → onResume
FirstActivity: → onStop()
返回鍵 OnPause() → onStop() → onDestory()
Home鍵 onPause → onSaveInstanceState() → onStop()
再啟動 onRestart() → onStart() → onResume
橫豎屏 銷毀重建。即onPause → onDestory → onCreate → onResume。
網(wǎng)上有說橫 → 豎:會執(zhí)行兩次。
我用vivoX6Plus-Android5.1.1測試,只會執(zhí)行一次流程。
不同手機、Android版本應(yīng)該有不同的回調(diào)方式。
鎖屏 onPause → onSaveInstanceState → onStop()
再啟動 onRestart() → onStart() → onResume

補充
當前Activity產(chǎn)生事件彈出Toast和AlertDialog的時候Activity的生命周期不會有改變
Activity運行時按下HOME鍵(跟被完全覆蓋是一樣的):onSaveInstanceState -->
onPause --> onStop onRestart -->onStart--->onResume
Activity未被完全覆蓋只是失去焦點:onPause--->onResume

面試相關(guān)問題:
1、屏幕橫豎屏切換時的生命周期變化
1)啟動Activity
onCreate -->
onStart -->
onResume

2)切換為橫屏
onSaveInstanceState -->
onPause -->
onStop -->
onDestroy-->
onCreate -->
onStart -->
onRestoreInstanceState -->
onResume

3)再次切換為豎屏,執(zhí)行了兩次
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->

onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume

4)修改AndroidManifest.xml,給該Activity添加
android:configChanges="orientation"
然后切換為橫屏
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume

5)再切換為豎屏,此時不會執(zhí)行兩次生命周期,但是多了一個onConfigurationChanged
onSaveInstanceState-->
onPause-->
onStop-->
onDestroy-->
onCreate-->
onStart-->
onRestoreInstanceState-->
onResume-->
onConfigurationChanged

總結(jié):
1、不設(shè)置Activity的android:configChanges時,切屏會重新調(diào)用各個生命周期,
切橫屏時會執(zhí)行一次,切豎屏時會執(zhí)行兩次
2、設(shè)置Activity的android:configChanges="orientation"時,切屏還是會重新調(diào)
用各個生命周期,切橫、豎屏時只會執(zhí)行一次
3、設(shè)置Activity的android:configChanges="orientation|keyboardHidden"時,
切屏不會重新調(diào)用各個生命周期,只會執(zhí)行onConfigurationChanged方法

2、一個 A Activity 跳到一個 B Activity中,生命周期的走動,點擊Back返回呢。如果一個 A Activity是透明的呢?如果 B Activity是一個Dialog呢?橫豎屏切換生命周期走動,以及是否了解onConfigurationChanged。
1)一個 A Activity 跳到一個 B Activity中,生命周期的走動
A:onPause
B:onCreate,onStart,onResume
A:onStop

2)點擊Back返回
B:onPause
A:onRestart,onStart,onResume
B:onStop,onDestroy

3)如果B Activity是透明的
A:onPause
B:onCreate,onStart,onResume
A沒有onStop了。

此時,返回鍵Back回到A:
B:onPause
A:onResume
B:onStop,onDestroy

4)如果 B Activity是一個Dialog
A:onPause()
B:onCreate()->onStart()->onResume()
A沒有onStop了。

此時,返回鍵Back回到A:
B:onPause
A:onResume
B:onStop,onDestroy

注:如果是彈出一個非Activity的Dialog,是不會走onPause的。

小結(jié):1)中A被完全覆蓋,會有onStop;3)、4)中A被部分覆蓋,不會有onStop。

5)橫豎屏切換生命周期走動
見問題1。

6)是否了解onConfigurationChanged?
當Configuration改變后,ActivityManagerService將會發(fā)送"配置改變"的廣播,會要求ActivityThread 重新啟動當前focus的Activity,這是默認情況,我們不做任何處理。如果我們用android:configChanges來配置Activity信息,那么就可以避免對Activity銷毀再重新創(chuàng)建,而是調(diào)用onConfigurationChanged方法。

onConfigurationChanged方法一般與android:configChanges屬性成雙成對,android:configChanges屬性指定了當前Activity可以自己處理的”配置信息“,然后調(diào)用onConfigurationChanged進行處理。

最常見的就是通過android:configChanges="orientation"告訴系統(tǒng),當屏幕配置改變時,我們的Activity會自己處理,不需要再次onCreate。
參考:https://www.cnblogs.com/lijunamneg/archive/2013/03/26/2982461.html

三、 其他回調(diào)方法

1、onSaveInstanceState()和onRestoreInstanceState()

Activity 的 onSaveInstanceState() 和 onRestoreInstanceState()并不是生命周期方法,不同于 onCreate()、onPause()等生命周期方法,它們并不一定會被調(diào)用。當應(yīng)用遇到意外情況(如:內(nèi)存不足、用戶直接按 Home 鍵)由系統(tǒng)銷毀一個 Activity 時,onSaveInstanceState() 會被調(diào)用。但是當用戶主動去銷毀一個 Activity 時,例如在應(yīng)用中按返回鍵,onSaveInstanceState()就不會被調(diào)用。 因為在這種情況下,用戶的行為決定了不需要保存 Activity 的狀態(tài)。通常 onSaveInstanceState() 只適合用于保存一些臨時性的狀態(tài),而 onPause()適合用于數(shù)據(jù)的持久化保存。 在 activity 被殺掉之前調(diào)用保存每個實例的狀態(tài),以保證該狀態(tài)可以在 onCreate(Bundle)或者 onRestoreInstanceState(Bundle) (傳入的 Bundle參數(shù)是由onSaveInstanceState封裝好的)中恢復。這個方法在一個activity 被殺死前調(diào)用,當該 activity 在將來某個時刻回來時可以恢復其先前狀態(tài)。例如,如果 activity B 啟用后位于 activity A 的前端,在某個時刻 activity A 因為系統(tǒng)回收資源的問題要被殺掉,A 通過 onSaveInstanceState 將有機會保存其用戶界面狀態(tài),使得將來用戶返回到 activity A 時能通過 onCreate(Bundle)或者 onRestoreInstanceState(Bundle)恢復界面的狀態(tài)

例:在此方法中對用戶寫的內(nèi)容進行保存

image.png

并在再次創(chuàng)建活動時恢復:

在onCreate中恢復:需要判斷savedInstanceState是否為空。

image.png

或者在onRestoreInstanceState()中恢復,不需要判空。

image.png

注:需要注意的是, onRestoreInstanceState()的回調(diào)是在onStart()之后的,所以如果保存的數(shù)據(jù)是希望用來恢復界面的,就不太適合放在這里取出了,而應(yīng)該放到onCreate()中。

2、onNewIntent()。
onNewIntent調(diào)用時機

https://blog.csdn.net/qq_36478274/article/details/105989145

四、其他

我對可見、可交互的理解:

1、當跳轉(zhuǎn)的時候,可見只是意為著當前活動可見,并不是說,下一個活動在onStart執(zhí)行完就可見,還是要等到onResume執(zhí)行結(jié)束才能看見。
2、可交互,是指在執(zhí)行onPause → onResume之間,不可交互,要到onResume結(jié)束后才可以交互。

寫于:2020/09/07

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

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