文章目錄
- 前言
- (一)如何了解Activity
- (二)Activity生命周期
-
- 1.常用的場景下的Activity生命周期
- 2.Activity的生命周期函數執行的時機情況如下:
- (三)Activity的狀态
- (四)Activity在異常情況下的生命周期
- (五)特殊情況下的生命周期分析---橫豎屏切換
- 總結
前言
在現在的VR行業中,大多數都是基于Android系統,但是曾經使用頻率很高的元件ACTIVITY現在在VR中基本不用,因為VR眼鏡的顯示大多數使用的是Unity3D 來做的3D 頁面。Activity更多的是做一些測試頁面。盡管這樣我們還是需要簡單的看看這個元件,剛入行的小萌新一定要看這個元件。本文中隻是簡單粗暴的例舉了Activity中的一些概念,不熟悉的讀者需要自己多去寫,多熟悉。基礎一定要打牢,這樣在後面的工作中才能事半工倍。
(一)如何了解Activity
Activity是Android四大元件中使用頻率最高的元件,他實際上是一個和使用者互動的接口。
(二)Activity生命周期
1.常用的場景下的Activity生命周期
(1)Activity啟動
onCreate()
onStart()
onResume()
(2)點選home鍵傳回到桌面
onPause()
onStop()
再次回到原Activity
onRestart()
onStart()
onResume()
(3)退出目前到Activity
onPause()
onStop()
onDestroy()
2.Activity的生命周期函數執行的時機情況如下:
- Activity的啟動通常是通過Intent來完成的,啟動一個Activity首先要執行的回調函數是onCreate(),在onCreate()中,通常會執行綁定布局,綁定控件(findViewById()),初始化等工作
- 接着會執行onStart()函數,執行之後Activity已經可見了,但是還沒有出現在前台,無法與使用者進行互動。這時候通常Activity已經在背景準備好了,執行onResume()函數就可以出現在前台和使用者互動了。
- 然後就是執行onResume(),然後Activity就可以出現在前台和使用者進行互動了
- 如果使用者啟動了一個新的Activity或者是傳回上一個Activity,則Activity會執行onPause()和onStop()函數,執行完onStop()後,Activity就處于了背景
- 當Activity執行完onDestory()方法後,Activity的生命就走向了終結,這是目前Activity最後一次回調生命周期函數,在這個函數中可以做一些資源釋放,廣播接收器登出的工作等回收工作
- 當使用者在其他的Activity或者桌面再切回目前Activity時,目前的Activity就會先執行onRestart()函數,然後執行onStart()函數,最後執行onResume90函數進入到運作态。
(三)Activity的狀态
Activity有四種狀态,分别是Active,Paused,Stopped,Killed他們的意思分别為:
(1)Active
Activity處于運作狀态,也就是擷取了焦點,可以和使用者進行互動,使用者可以通過點選,滑動等操作和界面進行互動
(2)Paused
Activity處于暫停狀态,也就是失去了焦點,此時Activity并沒有被銷毀,記憶體裡面的成員變量,狀态資訊等依然存在,并且這個Activity也有可能還能看見(對使用者可見),隻是焦點沒有在Activity的身上,使用者無法和它互動,例如在Activity上方彈了一個對話框,或者是有一個透明的Activity擷取了焦點,都會導緻目前的Activity處于Paused狀态
(3)Stopped
Stopped的狀态和Paused的狀态相似,他沒有被銷毀,并且記憶體中的成員變量等資訊仍然存在。在Stopped狀态下的Activity是完全不可見的。
(4)killed
Activity已經被銷毀了,比如使用者點選back鍵傳回上一個界面,或者跳轉到其他頁面的時候調用了finish()方法,都會使目前的Activity被銷毀
(四)Activity在異常情況下的生命周期
**哪些場景會使Activity處于異常情況呢?如下:
場景一:資源相關的系統配置發生改變導緻Activity被殺死并重新建立,例如如切換深色主題。
Activity被銷毀時,回調用onPause,onStop,onDestroy
同時由于Activity是異常終止的,是以系統會調用onSaveInstanceState來儲存目前Activity的狀态。當Activity被重建時,系統會調用onRestoreInstanceState(),并且把Activity銷毀時onSaveInstanceState方法所儲存的Bundle對象作為參數傳遞給onRestoreInstanceState和onCreate方法,是以我們可以通過onRestoreInstanceState和onCreate()方法來判斷Activity是不是被重建了,若是,我們就可以取出之前的資料并恢複
與此同時,在onSaveInstanceState和onRestoreInstanceState方法中,系統會自動為我們儲存目前Activity的視圖結構,并且在Activity重建時恢複這些資料:比如文本框中輸入的資料,ListView的滾動位置等
場景二:資源不足導緻低優先級的Activity被殺死
這裡的優先級指的是一個Activity對于使用者的重要程度,比如:正在和使用者互動的Activity 肯定是最重要的,Activity 的優先級如下:
最高:與使用者正在進行互動的Activity,即前台Activity
中等:可見但是非前台Activity,比如一個彈出對話框的Activity,可見但是非前台運作。
最低:完全存在于背景的Activity,比如:執行了onStop();
(五)特殊情況下的生命周期分析—橫豎屏切換
與橫豎屏生命周期函數有關調用的屬性是“Android:configChanges”,關于他的屬性值設定如下:
orientation:消除橫豎屏影響
keyboardHidden:消除鍵盤影響
screenSize:消除螢幕大小的影響
情況一:當我們設定Activity的Android:configChanges”,屬性為orientation或者是orientation|keyboardHidden或者不設定這個屬性的時候,Activity的生命周期會走如下流程:
剛啟動Activity的時候:
onCreate()
onStart()
onResume()
由豎屏切換到橫屏時:
onPause()
onSaveInstanceState()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
由橫屏切換到豎屏
onPause()
onSaveInstanceState()
onStop()
onDestroy()
onCreate()
onStart()
onRestoreInstanceState()
onResume()
當我們設定Activity的Android:configChanges”,屬性為orientation|keyboardHidden|screenSize或者為orientation|screenSize的時候,Activity的生命周期會走如下流程:
剛啟動Activity的時候,會走:
onCreate()
onStart()
onResume()
但是切換橫豎屏時不會調用任何的周期函數,但是必須要注意的是:設定了Activity的Android:configChanges”,屬性為orientation|keyboardHidden|screenSize或者為orientation|screenSize的時候,切換橫豎屏會調用onConfigurationChanged(),不會回調各個生命周期函數
最後附加兩個問題:
1.那啥時候Activity單獨走onPause()而不走onStop()呢?
當 Activity 被另一個透明或者 Dialog 樣式的 Activity 覆寫時,他隻會走onPasue,因為系統繼續維護其内部狀态,是以它仍然可見,但它已經失去了焦點故不可與使用者互動。是以被覆寫的Activity并不會執行onStop()方法。
2.啥時候Activity的onDestroy不執行?
當使用者背景強殺應用時,目前回退棧中隻有一個activity執行個體時這時候強殺是會執行onDestroy方法的,當回退棧中存在多個Activity執行個體時,棧裡面的第一個沒有銷毀的Activity會執行onDestroy,其他的activity不會執行。
總結
本文主要講解了Activity的一些概念知識和生命周期的知識,對剛入行的讀者起一個抛磚引玉的作用,讀者還需在實踐中多去寫代碼,體驗不同情況下的代碼邏輯。