1. 程式人生 > >活動2(生命週期,啟動模式)

活動2(生命週期,啟動模式)

一.活動的生命週期

為了在活動生命週期的各個階段之間導航轉換,Activity類提供了六個回撥的核心方法:onCreate(),onStart(),onResume(),onPause(),onStop()和onDestroy()。當活動進入新狀態時,系統會呼叫每個回撥。

完整的生命週期是從 onCreate()到onDestroy() , 可見的生命週期是從 onStart()到onStop() ,前臺的生命週期是從

onResume()到onPause()。

一般情況下,一個活動會在onCreate()中完成各種初始化操作在onDestroy()中完成釋放記憶體的操作

可以在onStart()方法中對資源進行載入,在onStop()方法中對資源進行釋放。

在前臺生命週期時,使用者與活動是處於互動的狀態。

 

在Android中,活動是通過任務(Task)來管理的,一個任務就是一組存放在棧中的活動的集合,這個棧叫返回棧(Back Stack)

每個活動在其生命週期中最多有4種狀態。

1.執行狀態,此時活動處於棧頂。

2.暫停狀態,活動不處於棧頂,但是還是可見的。比如說對話方塊。

3.停止狀態,此時活動完全不可見,系統仍會為其保留相應狀態,但不完全可靠。

4.銷燬狀態,活動從棧中被移除。

 

如果活動被回收了怎麼辦?

當活動進入停止狀態時,可能被系統回收。比如在A活動中啟動B活動,但是A被系統回收了,此時在B活動中按Back鍵,仍然會顯示活動A,只不過活動A是通過onCreate()重新建立的。如果活動A中存在臨時資料,那麼這些臨時資料就沒了。Activity中提供了一個回撥方法是 onSaveInstanceState(Bundle outState) ,它可以保證活動被回收之前一定呼叫該回調方法,所以可以在這個回撥方法中儲存臨時的資料。onSaveInstanceState(Bundle outState) ,該方法中的引數是Bundle型別,它可以用putXxx(key,value)來儲存資料。如下程式碼即儲存了臨時資料:

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putString("key", "value");
}

資料儲存後,我們還要將其取出。

在onCreate()方法中,存在一個Bundle型別的引數。如果活動被系統回收前通過了onSaveInstanceState()方法儲存資料的話,這個引數就會帶有之前儲存的臨時資料。程式碼如下:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState != null) {
        Xxx data = savedInstanceState.getXxx("key");
    }
}

 

二.活動的啟動模式

活動的啟動模式一共有4種,分別為standard、singleTop、singleTask、singleInstance。可以在AndroidManifest.xml中通過給<activity>標籤指定android:launchMode屬性來選擇啟動模式。

standard是活動預設的啟動模式。對於使用standard模式的活動,每次啟動都會建立該活動的一個新的例項。

singleTop模式:當啟動模式為singleTop時,如果發現Back Stack的棧頂已經是該活動,則直接使用該活動,不再建立新的活動例項。如果該活動不在棧頂,則會重新建立一個新的例項。

singleTask模式:當啟動模式為singleTask時,每次啟動該活動時系統首先檢查在Back Stack中是否存在該活動的例項,如果存在則直接使用該例項,並將其上的活動都出棧,不存在就建立一個新的活動例項。

singleInstance模式:這種模式最特殊和複雜,指定為當前模式的活動會啟用一個新的Back Stack來管理這個活動。在這種模式下會有一個單獨的Back Stack來管理這個活動,這就允許其他程式的呼叫,實現了共享活動例項的問題。