天天看點

将Android進行到底之Activity前言(一)如何了解Activity(二)Activity生命周期(三)Activity的狀态(四)Activity在異常情況下的生命周期(五)特殊情況下的生命周期分析—橫豎屏切換總結

将Android進行到底之Activity前言(一)如何了解Activity(二)Activity生命周期(三)Activity的狀态(四)Activity在異常情況下的生命周期(五)特殊情況下的生命周期分析—橫豎屏切換總結

文章目錄

  • 前言
  • (一)如何了解Activity
  • (二)Activity生命周期
    • 1.常用的場景下的Activity生命周期
    • 2.Activity的生命周期函數執行的時機情況如下:
  • (三)Activity的狀态
  • (四)Activity在異常情況下的生命周期
  • (五)特殊情況下的生命周期分析---橫豎屏切換
  • 總結

前言

在現在的VR行業中,大多數都是基于Android系統,但是曾經使用頻率很高的元件ACTIVITY現在在VR中基本不用,因為VR眼鏡的顯示大多數使用的是Unity3D 來做的3D 頁面。Activity更多的是做一些測試頁面。盡管這樣我們還是需要簡單的看看這個元件,剛入行的小萌新一定要看這個元件。本文中隻是簡單粗暴的例舉了Activity中的一些概念,不熟悉的讀者需要自己多去寫,多熟悉。基礎一定要打牢,這樣在後面的工作中才能事半工倍。

(一)如何了解Activity

Activity是Android四大元件中使用頻率最高的元件,他實際上是一個和使用者互動的接口。

(二)Activity生命周期

将Android進行到底之Activity前言(一)如何了解Activity(二)Activity生命周期(三)Activity的狀态(四)Activity在異常情況下的生命周期(五)特殊情況下的生命周期分析—橫豎屏切換總結

1.常用的場景下的Activity生命周期

(1)Activity啟動

onCreate()

onStart()

onResume()

(2)點選home鍵傳回到桌面

onPause()

onStop()

再次回到原Activity

onRestart()

onStart()

onResume()

(3)退出目前到Activity

onPause()

onStop()

onDestroy()

2.Activity的生命周期函數執行的時機情況如下:

  1. Activity的啟動通常是通過Intent來完成的,啟動一個Activity首先要執行的回調函數是onCreate(),在onCreate()中,通常會執行綁定布局,綁定控件(findViewById()),初始化等工作
  2. 接着會執行onStart()函數,執行之後Activity已經可見了,但是還沒有出現在前台,無法與使用者進行互動。這時候通常Activity已經在背景準備好了,執行onResume()函數就可以出現在前台和使用者互動了。
  3. 然後就是執行onResume(),然後Activity就可以出現在前台和使用者進行互動了
  4. 如果使用者啟動了一個新的Activity或者是傳回上一個Activity,則Activity會執行onPause()和onStop()函數,執行完onStop()後,Activity就處于了背景
  5. 當Activity執行完onDestory()方法後,Activity的生命就走向了終結,這是目前Activity最後一次回調生命周期函數,在這個函數中可以做一些資源釋放,廣播接收器登出的工作等回收工作
  6. 當使用者在其他的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的一些概念知識和生命周期的知識,對剛入行的讀者起一個抛磚引玉的作用,讀者還需在實踐中多去寫代碼,體驗不同情況下的代碼邏輯。

繼續閱讀