Activity的生命週期,它會自動執行那些方法? 方法如何覆寫?

Activity的生命週期(說明、覆寫方法、測試觀察)

Android系統在啟動一個Activity的過程中,有幾個特定的方法會被呼叫,稱為Callback方法,目的是提供設計Activity的人能夠更能靈活控制自己的Activity,本節將介紹幾個情境,與其方法與其被執行的時機。

一般情境

一個Activity啟動後出現在手機螢幕上,之後再由使用者按下返回鍵結束Activity,各個Callback方法執行時機說明如下:

  1. 當Activity準備要產生時,先呼叫onCreate方法。
  2. Activity產生後(還未出現在手機螢幕上),呼叫onStart方法。
  3. 當Activity出現手機上後,呼叫onResume方法。
  4. 當使用者按下返回鍵結束Activity時, 先呼叫onPause方法。
  5. 當Activity從螢幕上消失時,呼叫onStop方法。
  6. 最後完全結束Activity之前,呼叫onDestroy方法。

整個呼叫過程像是金字塔般,從金字塔的左邊Activity啟動開始往右,如下圖:

註】:本圖來自於http://developer.android.com。

暫停情境

當Activity已經顯示在手機螢幕上了,但這個Activity如果有對話框出現在Activity的前面,此時Activity是無法使用的,稱之為在暫停狀態下,這時候各個Callback方法執行時機說明如下:

(前三個步驟同上小節)

  1. 當出現對話框,Activity是部份可見,但無法使用時,呼叫onPause方法。
  2. 對話框消失,呼叫onResume方法後,Activity才完全可見。

呼叫過程如下圖標示的1與2:

註】:本圖來自於http://developer.android.com。

切換Activity情境

當Activity在手機螢幕時,使用者開啟最近使用的APP清單,並點擊了另一個APP時,在前景的Activity會停止並進入背景,直到使用者再由APP清單中點擊這個Activity後,這個Activity會被重新執行。

  1. 使用者點擊另一個APP執行,讓原本在前景的Activity進入背景前,會先呼叫onPause方法,再呼叫onStop方法後,此時Activity完全進入背景,不在手機畫面上。
  2. 當Activity由使用者從最近使用APP清單中被點擊了時,先執行onRestart方法。
  3. 之後再執行onStart方法後。
  4. Activity顯示在手機畫面後,再執行onResume方法。

呼叫過程如下圖標示的1到4:

註】:本圖來自於http://developer.android.com。

覆寫Callback方法

接下來我們利用MainActivity進行測試並驗證,首先要覆寫(override)父類別的Callback方法並使用Toast類別顯示該方法被執行,所要覆寫的方法有onStart、onResume、onPause、onStop、onRestart與onDestroy。這些方法有些屬於上層父類別,有些屬於更上一層或更多層的類別,因此在選擇時需要找到該方法屬於那層父類別下。

首先將游標移至MainActivity類別內的最後一行,Android Studio覆寫方法的按鍵是「Ctrl」+「O」(不是數字零,而是字母O),可用Override的第一個字母做為記憶的技巧,按下後會出現MainActivity的所有繼承類別與可覆寫的方法,如下圖:

此時請按著「Ctrl」鍵不放,用滑鼠點擊欲覆寫的方法,如onStop與onDestroy方法,只要按著Ctrl鍵去點擊,就可一次選擇多個方法,如下圖:

請再往下拉動捲抽找到onPause、onPause、onStart與onRestart方法都選取,最後按下Enter鍵即可,所選擇的方法都會在程式中覆寫完成,如下圖:

接著在各個方法中使用Toast類別分別顯示該方法的名稱,以便能在執行時得知該方法被執行了,部份程式碼如下:

    @Override
    protected void onStop() {
        super.onStop();
        Toast.makeText(this, "onStop", Toast.LENGTH_LONG).show();
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        Toast.makeText(this, "onDestroy", Toast.LENGTH_LONG).show();
    }
    @Override
    protected void onPause() {
        super.onPause();
        Toast.makeText(this, "onPause", Toast.LENGTH_LONG).show();
    } 
    @Override
    protected void onResume() {
        super.onResume();
        Toast.makeText(this, "onResume", Toast.LENGTH_LONG).show();
    }
    @Override
    protected void onStart() {
        super.onStart();
        Toast.makeText(this, "onStart", Toast.LENGTH_LONG).show();
    } 
    @Override
    protected void onRestart() {
        super.onRestart();
        Toast.makeText(this, "onRestart", Toast.LENGTH_LONG).show();
    }

最後別忙了也在onCreate方法中加入Toast程式碼:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Toast.makeText(this, "onCreate", Toast.LENGTH_LONG).show();
        setContentView(R.layout.activity_main);
    }

Comments

No comments yet. Why don’t you start the discussion?

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *