1. 程式人生 > >(一)Activity生命週期

(一)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