三分鐘教你完全掌握Activity的生命週期

Activity的生命週期

什麼是Activity?

當用戶瀏覽、退出和返回應用時,應用中的 Activity 實例會在其生命週期的不同狀態間轉換。

Activity類會提供許多回調,這些回調會讓 Activity 知曉某個狀態已經更改:系統正在創建、停止或恢復某個 Activity,或者正在銷燬該Activity 所在的進程。

在生命週期回調方法中,我們可以聲明用戶離開和再次進入 Activity 時 Activity 的行爲方式。

例如,如果您正在構建流式視頻播放器,則當用戶切換至另一應用時,您可能要暫停視頻並終止網絡連接。當用戶返回時,您可以重新連接到網絡,並允許用戶從同一位置繼續播放視頻。

Activity的作用?

良好的生命週期回調實現有助於確保應用避免:

  • 當用戶在使用應用時接聽來電,或切換至另一應用時崩潰。
  • 當用戶未積極使用它時,消耗寶貴的系統資源。
  • 當用戶離開應用並在稍後返回時,丟失用戶的進度。
  • 當屏幕在橫向和縱向之間旋轉時,崩潰或丟失用戶的進度。

Activity 生命週期概念

爲了在 Activity 生命週期的各個階段之間導航轉換,Activity 類提供六個核心回調:onCreate()onStart()onResume()onPause()onStop()onDestroy()。當 Activity 進入新狀態時,系統會調用每個回調。

下圖是Activity的總生命週期:

Activity 生命週期每個方法的含義和作用

在這裏,我儘量將每個方法的功能進行簡化,方便大家理解。

1. onCreate:創建方法

  • 生命週期的第一個方法
  • 進行Activity初始化工作
  • 此時Activity還在後臺,不可見,故動畫不應在此初始化

2. onStart:啓動方法

  • 生命週期的第二個方法
  • Activity可見,但未出現在前臺
  • 由於未出現在前臺,無法交互

3. onResume:繼續/重新開始方法

  • Activity出現前臺且可見
  • 可交互

4.onPause:暫停方法

  • Activity要跳到另一個Activity或應用正常退出時都會執行此方法
  • Activity在前臺並可見

5. onStop:停止方法

  • Activity不可見
  • Activity對象仍在內存中,沒有被銷燬
  • 主要參與資源回收工作

6. onDestroy:毀滅方法

  • Activity被銷燬,不可見
  • 可以將剩餘資源釋放,以及回收工作

7. onRestart:重新開始方法

  • Activity可見
  • 當用戶按Home鍵切換到桌面後又切回來或者從後一個Activity切回前一個Activity就會觸發這個方法
  • 一般不進行操作

下面這張圖片很好地總結了幾種方法的特點:

實際測試

Activity其實是繼承了ApplicationContext這個類,如下代碼:

 public class Activity extends ApplicationContext {
        protected void onCreate(Bundle savedInstanceState);
        
        protected void onStart();   
        
        protected void onRestart();
        
        protected void onResume();
        
        protected void onPause();
        
        protected void onStop();
        
        protected void onDestroy();
    }

爲了更好理解,我們可以重寫以上方法,用Log進行輸出,源碼如下:

package com.example.activitycreate;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.util.Log;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_example);
        Log.i("MainActivity","調用onCreate()方法");
    }

    //當頁面可見時
    @Override
    protected void onStart() {
        super.onStart();
        Log.i("MainActivity","調用onStart()方法");
    }

    //當Activity獲取焦點開始與用戶交互時
    @Override
    protected void onResume() {
        super.onResume();
        Log.i("MainActivity","調用onResume()方法");
    }

    //Activity被覆蓋鎖屏執行
    @Override
    protected void onPause() {
        super.onPause();
        Log.i("MainActivity","調用onPause()方法");
    }

    //頁面不可見
    @Override
    protected void onStop() {
        super.onStop();
        Log.i("MainActivity","調用onStop()方法");
    }

    //頁面銷燬
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Log.i("MainActivity","調用onDestroy()方法");
    }

    //頁面重新啓用
    @Override
    protected void onRestart() {
        super.onRestart();
        Log.i("MainActivity","調用onRestart()方法");
    }
}

運行工程後,打開Logcat視窗,加一個過濾器,如下圖:


下面開始測試:

打開應用:onCreate()->onStart()->onResume

Back鍵:onPause()->onStop()->onDestory()

Home鍵:onPause()->onStop()

Home鍵後再次啓動:onRestart()->onStart()->onResume()

大功告成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章