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); }