活動的生命周期

Android 使用任務(Task)來管理活動,一個任務就是一組存放在棧里的活動的集合,后進先出。

一、活動狀態


每個活動在其生命周期中最多可能會有四種狀態。

1. 運行狀態

當一個活動位于返回棧的棧頂時,這時活動就處于運行狀態。系統最不愿意回收的就是處于運行狀態的活動,因為這會帶來非常差的用戶體驗。

2. 暫停狀態

當一個活動不再處于棧頂位置,但仍然可見時,這時活動就進入了暫停狀態,比如對話框形式的活動只會占用屏幕中間的部分區域,處于暫停狀態的活動仍然是完全存活著的,系統也不愿意去回收這種活動(因為它還是可見的,回收可見的東西都會在用戶體驗方面有不好的影響),只有在內存極低的情況下,系統才會去考慮回收這種活動。

3. 停止狀態

當一個活動不再處于棧頂位置,并且完全不可見的時候,就進入了停止狀態。系統仍然會為這種活動保存相應的狀態和成員變量,但是這并不是完全可靠的,當其他地方需要內存時,處于停止狀態的活動有可能會被系統回收。

4. 銷毀狀態

當一個活動從返回棧中移除后就變成了銷毀狀態。系統會最傾向于回收處于這種狀態的活動,從而保證手機的內存充足。


二、活動的生存期


Activity 類中定義了七個回調方法,覆蓋了活動生命周期的每一個環節。

1. onCreate()

它會在活動第一次被創建的時候調用。應該在這個方法中完成活動的初始化操作,比如說加載布局、綁定事件等。

2. onStart()

這個方法在活動由不可見變為可見的時候調用。

3. onResume()

這個方法在活動準備好和用戶進行交互的時候調用。此時的活動一定位于返回棧的棧頂,并且處于運行狀態。

4. onPause()

這個方法在系統準備去啟動或者恢復另一個活動的時候調用。我們通常會在這個方法中將一些消耗 CPU 的資源釋放掉,以及保存一些關鍵數據,但這個方法的執行速度一定要快,不然會影響到新的棧頂活動的使用。

5. onStop()

這個方法在活動完全不可見的時候調用。它和 onPause() 方法的主要區別在于,如果啟動的新活動是一個對話框式的活動,那么 onPause() 方法會得到執行,而 onStop() 方法并不會執行。

6. onDestroy()

這個方法在活動被銷毀之前調用,之后活動的狀態將變為銷毀狀態。

7. onRestart()

這個方法在活動由停止狀態變為運行狀態之前調用,也就是活動被重新啟動了。


以上七個方法中除了onRestart()方法,其他都是兩兩相對的,從而又可以將活動分為三種生存期。

1. 完整生存期

活動在 onCreate() 方法和 onDestroy() 方法之間所經歷的,就是完整生存期。一般情況下,一個活動會在 onCreate() 方法中完成各種初始化操作,而在 onDestroy() 方法中完成釋放內存的操作。

2. 可見生存期

活動在 onStart() 方法和 onStop() 方法之間所經歷的,就是可見生存期。在可見生存期內,活動對于用戶總是可見的,即便有可能無法和用戶進行交互。我們可以通過這兩個方法,合理地管理那些對用戶可見的資源。比如在 onStart() 方法中對資源進行加載,而在 onStop() 方法中對資源進行釋放,從而保證處于停止狀態的活動不會占用過多內存。

3. 前臺生存期

活動在 onResume() 方法和 onPause() 方法之間所經歷的,就是前臺生存期。在前臺生存期內,活動總是處于運行狀態的,此時的活動是可以和用戶進行相互的,我們平時看到和接觸最多的也這個狀態下的活動。


三、圖示



四、代碼


@Override
protected void onCreate() {
    super.onCreate();
    //  事件
}

@Override
protected void onStart() {
    super.onStart();
    //  事件
}

@Override
protected void onResume() {
    super.onResume();
    //  事件
}

@Override
protected void onPause() {
    super.onPause();
    //  事件
}

@Override
protected void onStop() {
    super.onStop();
    //  事件
}

@Override
protected void onDestroy() {
    super.onDestroy();
    //  事件
}

@Override
protected void onRestart() {
    super.onRestart();
    //  事件
}

五、保存臨時數據


當一個活動進入到了停止狀態,是有可能被系統回收的。Activity 中還提供了一個 onSaveInstanceState() 回調方法,這個方法會保證一定在活動被回收之前調用,因此我們可以通過這個方法來解決活動被回收時臨時數據得不到保存的問題。

1. 保存臨時數據

onSaveInstanceState() 方法會攜帶一個Bundle 類型的參數,Bundle 提供了一系列的方法用于保存數據,鍵值對方式。如 putString()、putInt() 等。

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    String tempData = "Something you just typed";
    outState.putString("data_key", tempData);
}

2. 恢復臨時數據

onCreate()方法其實也有一個 Bundle 類型的參數。這個參數在一般情況下都是 null,但是當活動被系統回收之前有通過 onSaveInstanceState() 方法來保存數據的話,這個參數就會帶有之前所保存的全部數據,只需要再通過相應的取值方法將數據取出即可。

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

    if (savedInstanceState != null) {
        String tempData = savedInstanceState.getString("data_key");
        Log.d(TAG, tempData);
    }
......
}

Intent 還可以結合 Bundle 一起用于傳遞數據的,首先可以把需要傳遞的數據都保存在 Bundle 對象中,然后再將 Bundle 對象存放在 Intent 里。到了目標活動之后先從 Intent 中取出 Bundle,再從Bundle中一一取出數據。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容