Android 程式開發:(一)詳解活動 —— 1.1 Activity的生命周期(創作初衷)

前言:

    學習Android也有一年多瞭,目前在從事Android開發的工作。不敢說精通,但也小有心得。相信很多android初學者和我剛開始接觸android時一樣,往往隻瞭解某些知識點的表面,別人要是問點啥,還真就說不出個一二三來,往往處於“瞭解”階段。所以,我打算將自己學習android的過程和經驗總結整理一下,發表出來,希望對學習android的同學有所幫助,也算給自己的學習進行總結吧。生命不息,學習不止。一定要學會“享受”學習的過程,否則,學習起來就會很累。

    在我的學習過程中,有一點經驗和大傢分享一下,那就是“Deep Learning”:深入學習。多花點時間深入學習,總比走馬觀花強得多。有的時候,我們不是學不會,而是學的太快瞭,忘得也快。倒不如一個知識點一個知識點的慢慢學,學懂,完全掌握。今天,就先說說Activity的生命周期吧,很多面試官都喜歡問這個問題。。。其實很簡單,就是記住一些回調函數被觸發的時機。

    寫作初衷:希望能讓那些學習android程序開發的同學們少走一些彎路,僅此而已。我不是什麼大牛,隻是盡一些綿薄之力罷瞭。

Activity這個類,定義瞭一些回調函數來控制它的生命周期。

  • onCreate()  ——  當Activity第一次創建的時候被調用。
  • onStart()  ——  當Activity對用戶可見的時候被調用。
  • onResume()  ——  當Activity開始和用戶交互的時候被調用。
  • onPause()  ——  正在運行的Activity馬上要被暫停的時候被調用,此時,在這之前的Activity被重新獲取。
  • onStop()  ——  當Activity不在對用戶可見的時候被調用。

默認地,被創建的Activity中都包含一個onCreate()方法,通過這個方法,可以創建顯示給用戶的UI組件。

從“被創建”到“被銷毀”的生命周期圖示:

想要理解Activity生命周期的最好辦法就是創建一個工程,並實現所有的回調函數,然後讓Activity與用戶交互。

1、創建一個工程:Activity101。

2、Activity101Activity.java中的代碼。

public class Activity101Activity extends Activity { 
    String tag = "Lifecycle"; 
 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
 
        setContentView(R.layout.main); 
        Log.d(tag, "In the onCreate() event"); 
    } 
 
    public void onStart() { 
        super.onStart(); 
        Log.d(tag, "In the onStart() event"); 
    } 
 
    public void onRestart() { 
        super.onRestart(); 
        Log.d(tag, "In the onRestart() event"); 
    } 
 
    public void onResume() { 
        super.onResume(); 
        Log.d(tag, "In the onResume() event"); 
    } 
 
    public void onPause() { 
        super.onPause(); 
        Log.d(tag, "In the onPause() event"); 
    } 
 
    public void onStop() { 
        super.onStop(); 
        Log.d(tag, "In the onStop() event"); 
    } 
 
    public void onDestroy() { 
        super.onDestroy(); 
        Log.d(tag, "In the onDestroy() event"); 
    } 

public class Activity101Activity extends Activity { String tag = "Lifecycle"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Log.d(tag, "In the onCreate() event"); } public void onStart() { super.onStart(); Log.d(tag, "In the onStart() event"); } public void onRestart() { super.onRestart(); Log.d(tag, "In the onRestart() event"); } public void onResume() { super.onResume(); Log.d(tag, "In the onResume() event"); } public void onPause() { super.onPause(); Log.d(tag, "In the onPause() event"); } public void onStop() { super.onStop(); Log.d(tag, "In the onStop() event"); } public void onDestroy() { super.onDestroy(); Log.d(tag, "In the onDestroy() event"); } }
 
 
3、按F11在模擬器上調試。
4、當這個activity第一次被加載:
 
[plain] view plaincopy
03-23 01:54:32.602: D/Lifecycle(644): In the onCreate() event 
03-23 01:54:32.602: D/Lifecycle(644): In the onStart() event 
03-23 01:54:32.602: D/Lifecycle(644): In the onResume() event 

5、按“返回鍵”,程序退出:

 
 
 
03-23 01:58:28.307: D/Lifecycle(644): In the onPause() event 
03-23 01:58:28.762: D/Lifecycle(644): In the onStop() event 
03-23 01:58:28.837: D/Lifecycle(644): In the onDestroy() event 
6、重新進入程序:
 
 
03-23 01:59:38.282: D/Lifecycle(644): In the onCreate() event 
03-23 01:59:38.292: D/Lifecycle(644): In the onStart() event 
03-23 01:59:38.302: D/Lifecycle(644): In the onResume() event 
7、按“撥號鍵”進入撥號界面,activity被轉入後臺運行:
 
 
03-23 02:00:23.252: D/Lifecycle(644): In the onPause() event 
03-23 02:00:24.522: D/Lifecycle(644): In the onStop() event 
8、註意,此時onDestroy()方法並沒有被觸發,說明這個activity還在內存中。按“返回鍵”,退出撥號界面,這個Activity又重新可見瞭。觀察LogCat窗口中的輸出:
 
 
03-23 02:03:25.262: D/Lifecycle(644): In the onRestart() event 
03-23 02:03:25.262: D/Lifecycle(644): In the onStart() event 
03-23 02:03:25.262: D/Lifecycle(644): In the onResume() event 
onRestart()方法被觸發瞭,接下來是onStart()和onResume()。
 

可以從這個簡單的例子中看到,當點擊“返回鍵”的時候,activity被銷毀瞭,與此同時,activity當前的狀態也將消失。有一點需要特別註意,onPause()方法僅在兩種情況下被調用:一個是在Activity被轉入後臺運行的時候,一個是用戶按“返回鍵”將activity銷毀的時候。www.aiwalls.com

當一個anctivity被啟動之後,onStart()和onResume()方法總是要被調用的,無論這個activity是從後臺重新獲取的,還是首次被創建的。當一個anctivity第一次被創建的時候,onCreate()方法總是被調用。

 

從上面的例子,我們可以得出結論:

  • 使用onCreate()方法去創建和初始化將要使用的組件。
  • 使用onResume()方法去開啟服務和執行代碼。當Activity處於“前臺”模式下,這些服務和代碼需要被開啟或執行。
  • 使用onPause()方法去停止服務和阻斷代碼。當Activity處於“後臺”模式下,這些服務和代碼不需要被開啟或執行。
  • 使用onDestroy()方法去釋放資源
    摘自 manoel的專欄

發佈留言