《Android》Activity生命週期詳解

1、什麼是Activity的生命週期?

用戶在使用一個應用程序時,隨着應用的啓動、頁面的跳轉、進入後臺等一些操作的發生,Activity會回調一些固定的方法,這些回調方法標識了Activity的狀態改變,比如創建、銷燬、暫停、進入後臺等等。這就是Activity的生命週期。

2、Activity生命週期回調方法有哪些?

常用的7個 + Activity異常關閉(比如內存不足)2個 = 9個方法

常用的7個:(3對方法+1個重新啓動方法):
創建/銷燬:onCreate(Bundle savedInstanceState) /onDestroy()
啓動/停止(可見/不可見):onStart()/onStop()
在前臺/在後臺:onResume()/onPause
已經存在的activity重新啓動: onRestart()

Activity異常的2個:
異常退出保存數據:onSaveInstanceState(Bundle savedInstanceState)
恢復Activity之前保存的數據:onRestoreInstanceState(Bundle savedInstanceState)

3、Activity生命週期的簡化說明官方配圖

在這裏插入圖片描述

4、生命週期方法調用時機與作用

onCreate(Bundle savedInstanceState)
調用時機:系統在第一次創建Activity時候回調,並且只會回調一次。
作用:可以做一些初始化的工作,比如:
setContentView ()
初始化控件 findViewById()
與ViewModel關聯
發送http請求
可以利用只會調用一次的特點,做一次性操作。

onStart()
調用時機:緊跟onCreate()之後,當Activity進入啓動狀態時,被調用。
作用:這個方法調用代表Acitvity已經可見(但是在後臺)
這個方法可以用來做頁面追蹤來記錄“進入頁面”的用戶行爲

onResume()
調用時機:onStart()之後,當Activity“每次”來到前臺時候被調用。注意是“每次”,
作用:這個方法代表Activity已經可以和用戶進行交互了,在可交互狀態會保持在這個生命週期不動,除非被打斷,比如按了home鍵,息屏等等。因爲Activity每次回到前臺,都會調用這個生命週期方法(屏幕的亮滅、按Home鍵在回到頁面等等),可以在這個方法裏面做一些刷新頁面的操作,比如重新發送http請求顯示最新數據等等。

onPause()
調用時機:當Activity回到後臺時候被調用。
作用:這個方法代表Activity已經失去了用戶焦點,不能和用戶進行交互了。但是這不代表這個Activity不可見,準確的來形容因該是這個Activity“部分可見”。這個方法用要注意以下2點:
1、當啓動了一個使用了dialog主題或者透明主題的新Actvity時,原Activity還能看到部分界面,沒有完整別遮蓋,但是失去了焦點。這時原Activity會停留在onPause()生命週期,原Activity重新回到前臺時候會直接回調onResume()生命週期。
當多個應用程序以多窗口模式運行時。因爲任何時候只有一個應用程序有焦點,系統會暫停所有其他應用程序。也會停留在onPause()
2、要注意不要再onPause()方法中做耗時操作,因爲會影響從這個Activity啓動的新Activity的速度,原因是原Activity先執行完onPause()纔去創建新Activity,新Activity執行完onResume()也就是出現在前臺時候,原Activity纔會走onStop()

onStop()
調用時機:當Activity不可見時候被回調。這裏的不可見,是完全看不到了。
作用:可以在這個方法裏停止一些不需要的操作,比如暫停動畫播放,暫停banner輪播等,onStop()也是用來做頁面追蹤來記錄“退出頁面”的用戶行爲。

onDestroy()
調用時機:當Activity銷燬時候被回調。是Activity生命週期的最後一步。
作用:這裏主要就是要做一些回收清理工作,避免內存泄漏。比如把對象置null。調用一些對象的close方法等等。

onRestart()
調用時機:當Activity重新顯示時回調,接下來是回調onStart()和onResume()。
作用:這裏可以做一些重新請求。onResume()中做請求會太過頻繁,onRestart() 只有在處於onStop()的Activity,重新回到前臺過程中,回調一次。

以下兩個方法筆者理解也可以劃分爲生命週期方法,因爲隨着Activity的創建和銷燬會根據時機回調。而且下面2個方法的參數還和onCreate方法的參數有這關聯。但是官方文檔建議不要同上面7種生命週期方法混淆。同onActivityResult()方法不一樣,onActivityResult不是Activity畢竟之路。

onSaveInstanceState(Bundle savedInstanceState)
調用時機:當Activity被系統異常銷燬時,會回調此方法,在Activity正常銷燬時不會調用。
如果調用此方法,將在onStop()之後執行。(老版本系統將在onStop()之前回調,且不能保證它和onPause()方法回調的先後順序。比如Android5.0版本。)
作用:onSaveInstanceState作用很專一。一般就是用來存儲需要保存的數據。異常情況(比如內存不足被回收)的出現,會使Activity中的一些必要數據丟失。可以用此方法中的Bundle參數用鍵值對的形式保存。這個參數會傳遞給onCreate(Bundle savedInstanceState)和onRestoreInstanceState(Bundle savedInstanceState)2個方法。用來恢復數據。

onRestoreInstanceState(Bundle savedInstanceState)
調用時機:當Activity被重新創建,系統會調用次方法,onStart()之後onResume()之前被調用。
作用:通過Bundle參數來恢復數據,這個參數同onCreate方法中的參數是一樣的。且這個方法的參數肯定不爲null,onCreate()的參數有可能爲null,要注意判斷,官方建議在onRestoreInstanceState中做恢復數據操作。

最後:並不是所有的生命週期方法都需要重寫,要根據你的Activity業務流程,適當選擇重寫哪些方法。本文如有錯誤歡迎留言指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章