woff 發表於 2018-7-8 19:42:06

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

Activity的生命週期(說明、覆寫方法、測試觀察)
Android系統在啟動一個Activity的過程中,有幾個特定的方法會被呼叫,稱為Callback方法,目的是提供設計Activity的人能夠更能靈活控制自己的Activity,本節將介紹幾個情境,與其方法與其被執行的時機。


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

當Activity準備要產生時,先呼叫onCreate方法。
Activity產生後(還未出現在手機螢幕上),呼叫onStart方法。
當Activity出現手機上後,呼叫onResume方法。
當使用者按下返回鍵結束Activity時, 先呼叫onPause方法。
當Activity從螢幕上消失時,呼叫onStop方法。
最後完全結束Activity之前,呼叫onDestroy方法。
整個呼叫過程像是金字塔般,從金字塔的左邊Activity啟動開始往右,如下圖:



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

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

(前三個步驟同上小節)

當出現對話框,Activity是部份可見,但無法使用時,呼叫onPause方法。
對話框消失,呼叫onResume方法後,Activity才完全可見。
呼叫過程如下圖標示的1與2:



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

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

使用者點擊另一個APP執行,讓原本在前景的Activity進入背景前,會先呼叫onPause方法,再呼叫onStop方法後,此時Activity完全進入背景,不在手機畫面上。
當Activity由使用者從最近使用APP清單中被點擊了時,先執行onRestart方法。
之後再執行onStart方法後。
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);
    }
文章出處

頁: [1]
查看完整版本: Activity的生命週期,它會自動執行那些方法? 方法如何覆寫?