1. 程式人生 > >活動(activity)的生命週期

活動(activity)的生命週期

一、週期的各個階段

首先,通過谷歌官方釋出的生命週期圖來理解一下整個流程:

這裡寫圖片描述

首先在這裡簡要介紹一下週期中各個方法:

onCreate():在活動被建立的時候執行
onStart():在活動開始可見的時候執行
onPause():在活動失去焦點,不可互動的時候執行,但此時此活動仍然可見
onStop():在活動完全被其他活動覆蓋的時候執行,顯然,此時活動不可見了
onDestory():在活動銷燬的時候
onRestart():當被覆蓋的活動沒被回收再次啟動的時候呼叫。

二、用三個小週期去理解整個生命週期

1.完整的生命週期

從onCreate()到onDestroy()之間所經歷的的是完整的生命週期。所以,應該在onCreate()完成各種初始化操作,在onDestroy()完成各種資源回收的操作。

2.可見的生命週期

從onStart()到onStop()之間所經歷的的是可見生命週期,只要是在這之間,activity的內容都是可見的。既然是從onStart()開始可見,到onStop()不可見,那麼我們就可以在onStart()裡邊載入使用者可見的資源,在onStop()裡邊釋放這些資源。這樣的話,比在onDestroy()裡邊釋放資源要節省記憶體。

3.前臺生命週期

從onResume()到onPause()之間經歷的是前臺生命週期,在這之間的不僅可見,而且是可以互動的。

三、各個方法執行的時機

onCreate():

這個不用多說啦,就是在Activity被建立的時候呼叫。如果一個Activity被回收掉,那麼他再次啟動的時候也會呼叫這個方法。

onStart()

Activity被建立以後,便開始啟動,執行了onStart()方法以後,這個Activity便可見。如果一個Activity被完全覆蓋但是系統沒有回收它,那麼他再次啟動的時候,便會先執行onRestart()方法,然後再次執行onStart()方法。右上邊的圖片可以看出

onResume()

查了一下單詞“Resume”的意思是恢復的意思。實在搞不明白恢復放在這裡的關係。但是onResume()執行完以後,這個Activity便可以與使用者進行互動了。這個Activity便處於正式的執行狀態,可以與使用者進行互動。

onPause()

當另外一個活動來到前臺的時候,此時要將當前執行的Activity覆蓋,會先執行這個方法,然後在執行onStop()。不過,如果到來的是一個對話方塊(沒有完全覆蓋當前Activity)的話,當前的Activity便會執行到onPause(),不會繼續執行inStop(),因為他並不是完全不可見的。此時,在這個狀態下,除非是記憶體極其緊張,否則不會回收這個Activity。

onStop()

如果當前activity被另一個Activity覆蓋了,完全不可見了。那麼onStop()便會被執行。如果記憶體緊張的時候,便會回收掉這個Activity。如果回收的話便會向下執行到onDestroy().

onRestart()

如果被完全覆蓋的activity沒有被回收,那麼他再次執行的時候便會首先執行onRestart()方法。在執行onStart()方法。

onDestroy()

當系統記憶體不足了,那麼他便會首先搜尋被完全覆蓋的Activity,將他們的記憶體釋放掉,釋放的時候便會執行onDestroy()方法。我們可以在onDestroy()中釋放一些自己定義的變數。

四、活動被回收了怎麼辦

對於一般的活動,當被系統回收掉以後,無非就是重新建立這個活動。但是如果一個活動我們要求他再次建立的時候保持原樣,就比如我們在文字框裡輸入了一些內容。那麼此時該怎麼辦呢?
自然是有辦法解決的:

onSaveInstanceState(Bundle bundle){

}

這個方法會保證在活動被回收前被呼叫,因此我們就可以在這個方法之中做一些儲存操作。然後onCreate()接受的引數就是這個方法儲存的那個Bundle。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

五、總結

郭霖大神在他的《第一行程式碼》關於活動的宣告週期的講解算是比較透徹,令我受益匪淺。