TShopping

 找回密碼
 註冊
搜索
查看: 1548|回復: 0
打印 上一主題 下一主題

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

  [複製鏈接]
跳轉到指定樓層
1#
發表於 2018-7-8 19:42:06 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
 
Push to Facebook
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類別分別顯示該方法的名稱,以便能在執行時得知該方法被執行了,部份程式碼如下:


  1. @Override
  2.     protected void onStop() {
  3.         super.onStop();
  4.         Toast.makeText(this, "onStop", Toast.LENGTH_LONG).show();
  5.     }

  6.     @Override
  7.     protected void onDestroy() {
  8.         super.onDestroy();
  9.         Toast.makeText(this, "onDestroy", Toast.LENGTH_LONG).show();
  10.     }

  11.     @Override
  12.     protected void onPause() {
  13.         super.onPause();
  14.         Toast.makeText(this, "onPause", Toast.LENGTH_LONG).show();
  15.     }

  16.     @Override
  17.     protected void onResume() {
  18.         super.onResume();
  19.         Toast.makeText(this, "onResume", Toast.LENGTH_LONG).show();
  20.     }

  21.     @Override
  22.     protected void onStart() {
  23.         super.onStart();
  24.         Toast.makeText(this, "onStart", Toast.LENGTH_LONG).show();
  25.     }

  26.     @Override
  27.     protected void onRestart() {
  28.         super.onRestart();
  29.         Toast.makeText(this, "onRestart", Toast.LENGTH_LONG).show();
  30.     }
複製代碼

最後別忙了也在onCreate方法中加入Toast程式碼:
  1.     @Override
  2.     protected void onCreate(Bundle savedInstanceState) {
  3.         super.onCreate(savedInstanceState);
  4.         Toast.makeText(this, "onCreate", Toast.LENGTH_LONG).show();
  5.         setContentView(R.layout.activity_main);
  6.     }
複製代碼

文章出處


 

臉書網友討論
*滑块验证:
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2024-4-20 01:43 , Processed in 0.059936 second(s), 25 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表