(一)Activity生命週期
(一)Activity之生命週期
一、概念
Activity是Android四大元件之一,其主要功能是與使用者互動,向用戶顯示內容,接收使用者輸入(點選,滑動),可以說Activity是四大元件中最重要的元件(當然了,其他3個元件也很重要)。那麼掌握activity的生命週期就顯得很有必要。比如初始化動作適合在哪裡做,什麼時候該釋放資源。點選back和home,activity會發生怎樣的變化,兩者有什麼不同。橫豎屏切換的時候,activity生命週期是怎樣的。activity彈出dialog,生命週期會發生變化嗎?......
帶著這些疑問,接下來我們就一塊學習下,首先我們先看下都有哪些常見的生命週期
二、生命週期
2.1常見生命週期
Activity共有4種狀態:
Active:此時activity位於棧頂,可見,並且正在與使用者互動
Paused:activity仍然可見,但是不能與使用者互動了。比如啟動了一個非全屏的activity或者透明的activity。
Stoped:activity不可見,與不能與使用者互動了。啟動了一個一般的activity
Destroyed:使用者點選back或者系統將activity例項銷燬。
onCreate:當Activity第一次被建立時呼叫。是生命週期開始的第一個方法。在這裡我們可以做一些初始化的操作,比如:呼叫setContentView()方法去載入介面,繫結佈局裡的一些控制元件,初始化一些Activity需要用到的資料。之後會呼叫onStart方法
onStart:當Activity正在變為可見時呼叫。這個時候Activity已經可見了,但是還沒有出現在前臺還不能跟使用者互動。可以簡單理解為Actvity已經可見但是還沒有出現在前臺。之後會呼叫onResume
onResume:當Activity可以跟使用者互動時呼叫,這個時候,這個Activity位於棧的頂部。跟onStart相比,它們都是表示Activity已經可見,但是onStart呼叫時Activity還在後臺,而呼叫onResume時,Activity已經進入了前臺,可以跟使用者互動了。之後會呼叫 onPause
onPause:當Activity暫停時呼叫這個方法;在這裡我們可以用來儲存資料,關閉動畫和其它比較耗費CPU的操作;但是在這裡做的操作絕對不能耗時,因為如果當前Activity要啟動一個新的Activity,這個新的Activity會在當前Activity執行完畢onPause之後才能進入可見狀態。這個方法之後一般會呼叫的方法有onStop或者onResume
onStop:當Activity進入後臺,並且不會被使用者看到時呼叫。當別的Activity出現在前臺時,或者Activity會被銷燬時,呼叫此方法;在這個方法呼叫之後,系統可能會在記憶體不夠的情況下回收Activity;在這個方法之後一般會呼叫onRestart或者onDestroy
onDestroy:這個方法是Activity生命週期中呼叫的最後一個方法。它會在Activity被銷燬之前呼叫;Activity銷燬原因一般是我們呼叫Activity的finish方法手動銷燬,另一個就是系統在記憶體緊張的情況下去銷燬Activity,以用來節省空間。我們可以通過方法 isFinishing 來判斷Activity是否正在被銷燬。
onRestart:這個方法是在Activity處於停止狀態後,又回到可視狀態時呼叫。之後會呼叫onResume
常見的生命就是以上這些了,一定要注意理解每個生命週期的意思,這些生命週期都是系統幫我們回調回來的,雖然我們沒必要對回撥過程做太深入的研究(一般情況下不需要),但是一定要理解,生命週期方法代表的意義。
生命週期其實就是android系統在告訴我們activity處於什麼樣的狀態,我們需要在不同的狀態下做不同的事情。
2.2特殊生命週期
(1)back鍵和home鍵
back:finish->onPause->onStop->onDestory。也就是說點選了back後,再次進入該activity需要重新onCreate
home:onPause->onStop。此時Activity例項並沒有銷燬,所以再次進入時走onRestart->onStart->onResume
注意兩種方式生命週期的不同
(2)結束:finish和onDestroy
finish,比如使用者點選back,會主動回撥finish,最終銷燬Activity例項
onDestroy,系統回撥的生命週期,也會銷燬Activity例項
我們看一下finish的原始碼
/**
* Call this when your activity is done and should be closed. The
* ActivityResult is propagated back to whoever launched you via
* onActivityResult().
*/
public void finish() {
finish(DONT_FINISH_TASK_WITH_ACTIVITY);
}
都是去結束activity,區別就是一個是主動,一個是被動我們知道,系統會盡可能的儲存執行的程序,一旦記憶體吃緊,就會根據一套規則去清理程序,一旦應用因為記憶體原因被系統強制回收了,那麼再次進入的時候是可以儲存之前的狀態的,是怎麼回事呢?這裡引入2個生命週期
(3)儲存/恢復,onSaveInstanceState,onRestoreInstanceState
onSaveInstanceState,部分註釋如下
/**
* Called to retrieve per-instance state from an activity before being killed
* so that the state can be restored in {@link #onCreate} or
* {@link #onRestoreInstanceState} (the {@link Bundle} populated by this method
* will be passed to both).
意思就是說當Activity將要被killed時候呼叫,以便再次開啟該Activity時可以通過Bundle物件恢復資料。
使用者主動銷燬的Activity不會呼叫,只有系統未經使用者允許的情況下,銷燬了Activity,這時候才可能會呼叫。
onRestoreInstanceState,不做詳細研究,儲存的時機和作用清楚了,恢復的意思顯而易見。
(4)onNewIntent
還是先看定義
* This is called for activities that set launchMode to "singleTop" in
* their package, or if a client used the {@link Intent#FLAG_ACTIVITY_SINGLE_TOP}
* flag when calling {@link #startActivity}. In either case, when the
* activity is re-launched while at the top of the activity stack instead
* of a new instance of the activity being started, onNewIntent() will be
* called on the existing instance with the Intent that was used to
* re-launch it.
從字面上理解,一個新的intent。我們知道,啟動activity,是需要intent的,onNewIntent其實就是再次啟動activity時的回撥方法。
注意,這個方法不是再次啟動activity就一定會呼叫。當可以複用activity例項時,會呼叫。不單是singleTop,其他啟動模式只要複用都會呼叫,預設的啟動模式是永遠建立新例項,所以永遠不會呼叫
關於啟動模式的可以看下一篇 《啟動模式》,結論:activity複用,就會呼叫onNewIntent