前言:本文主要介紹Activity相關的一些内容。Activity作為四大元件之首,是使用最為頻繁的一種元件。正常情況下,除了UWindow、Dialog 和 Toast,我們能見到的界面的确隻有Activit。Activity是如此重要。
1 .1Activity的生命周期全面分析
本節将Activity的生命周期分為兩部分内容,一部分是典型情況下的生命周期,另一部分是異常情況下的生命周期。
所謂典型情況下的生命周期,是指在有使用者參與的情況下,Activity 所經過的生命周期的改變;
而異常情況下的生命周期,是指 Activity 被系統回收 或者 由于目前裝置的 Configuration 發生改變進而導緻 Activity 被銷毀重建,異常情況下的生命周期的關注點和典型情況下略有不同。
1.1.1 典型情況下的生命周期分析
在正常情況下,Activity會經曆如下生命周期。
- onCreate:表示 Activity 正在被建立,這是生命周期的第一個方法。在這個方法中, 我們可以做一些初始化工作,比如調用setContentView 去加載界面布局資源、初始化Activity 所需資料等。
- onRestart:表示 Activity 正在重新啟動。一般情況下,當目前 Activity 從不可見重新變為可見狀态時,onRestart 就會被調用。這種情形一般是使用者行為所導緻的,比如使用者按 Home 鍵切換到桌面或者使用者打開了一個新的 Activity,這是目前的 Activity 就會暫停,也就是 onPause 和 onStop 被執行了,接着使用者又回到了這個 Activity,就會出現這種情況。
- onStart:表示 Activity 正在被啟動,即将開始,這時 Activity 已經可見了,但是還沒有出現在前台,還無法和使用者互動。這個時候其實可以了解為 Activity 已經顯示出來了,但是我們還看不到。
- onResume:表示 Activity已經可見了,并且出現在前台并開始活動。要注意這個和 onStart 的對比,onStart 和 onResume 都表示Activity已經可見,但是 onStart 的時候 Activity 還在背景,onResume 的時候 Activity 才顯示到前台。
- onPause:表示 Activity 正在停止,正常情況下,緊接着 onStop 就會被調用。在特殊情況下,如果這個時候快速地再回到目前 Activity,那麼 onResume 會被調用。筆者的了解是,這種情況屬于極端情況,使用者操作很難重制這一場景。此時可以做一些存儲資料、 停止動畫等工作,但是注意不能太耗時,因為這會影響到新 Activity 的顯示,onPause 必須先執行完,新 Activity的 onResume 才會執行。
- onStop:表示 Activity 即将停止,可以做一些稍微重量級的回收工作,同樣不能太耗時。
- onDestroy:表示 Activity 即将被銷毀,這是 Activity 生命周期中的最後一個回調, 在這裡,我們可以做一些回收工作和最終的資源釋放。
正常情況下,Activity的常用生命周期就隻有上面 7 個,圖1-1,1-2會更詳細地描述了 Activity 各種生命周期的切換過程。
圖1-1
圖1-2
二、異常情況下生命周期
所謂的異常情況,通常指的是手機配置改變和因記憶體不足導緻被系統回收。
-
onSaveInstanceState 方法會在按Home鍵或者啟動新 Activity 以及 Activity 被異常終止時觸發調用。 Activity 被異常終止的情況下,它的調用時機是在 onStop 之前,它和 onPause 方法沒有既定的時序關系。當 Activity 被重新建立的時候,onRestoreInstanceState 會被回調,它的調用時機是 onStart 之後。非異常終止時,不調用 onRestoreInstanceState。
“系統隻會在 Activity 即将被銷毀并且有機會重新顯示的情況下才會去調用 onSaveInstanceState 方法。”
- 調用 onSaveInstanceState 與 onRestoreInstanceState 來儲存和恢複的資料,比如文本框中使用者輸入的資料、listview 滾動的位置等,這些 view 相關的狀态系統都會預設為我們恢複。具體針對某一個 view 系統能為我們恢複哪些資料可以檢視 view 的源碼中的 onSaveInstanceState 和 onRestoreInstanceState 方法。
- android:configChanges=”xxx”屬性,常用的主要有下面三個選項:local: 裝置的本地位置發生了變化,一般指切換了系統語言;keyboardHidden: 鍵盤的可通路性發生了變化,比如使用者調出了鍵盤;orientation: 螢幕方向發生了變化,比如旋轉了手機螢幕。配置了 android:configChanges=”xxx”屬性之後,Activity就不會在對應變化發生時重新建立,而是調用 Activity 的 onConfigurationChanged 方法。
- Activity 優先級(不易被回收程度):前台 Activity > 可見但非前台 Activity > 背景 Activity。