Android Activity生命週期

轉自: http://blog.csdn.net/Android_Tutor/archive/2010/07/28/5772285.aspx

 

大家好,今天給大家詳解一下Android中Activity的生命週期,我在前面也曾經講過這方面的內容,但是像網上大多數文章一樣,基本都是翻 譯Android API,過於籠統,相信大家看了,會有一點點的幫助 ,但是還不能完全吃透,所以我今天特意在重新總結一下.

首先看一下Android api中所提供的Activity生命週期圖(不明白的,可以看完整篇文章,在回頭看一下這個圖,你會明白的):

Activity其實是繼承了ApplicationContext這個類,我們可以重寫以下方法,如下代碼:

  1. public   class  Activity  extends  ApplicationContext {  
  2.        protected   void  onCreate(Bundle savedInstanceState);  
  3.          
  4.        protected   void  onStart();     
  5.          
  6.        protected   void  onRestart();  
  7.          
  8.        protected   void  onResume();  
  9.          
  10.        protected   void  onPause();  
  11.          
  12.        protected   void  onStop();  
  13.          
  14.        protected   void  onDestroy();  
  15.    }  

爲了便於大家更好的理解,我簡單的寫了一個Demo,不明白Activity週期的朋友們,可以親手實踐一下,大家按照我的步驟來。

第一步:新建一個Android工程,我這裏命名爲ActivityDemo.

第二步:修改ActivityDemo.java(我這裏重新寫了以上的七種方法,主要用Log打印),代碼如下:

  1. package  com.tutor.activitydemo;  
  2. import  android.app.Activity;  
  3. import  android.os.Bundle;  
  4. import  android.util.Log;  
  5. public   class  ActivityDemo  extends  Activity {  
  6.      
  7.     private   static   final  String TAG =  "ActivityDemo" ;  
  8.       
  9.     public   void  onCreate(Bundle savedInstanceState) {  
  10.         super .onCreate(savedInstanceState);  
  11.         setContentView(R.layout.main);  
  12.           
  13.         Log.e(TAG, "start onCreate~~~" );  
  14.     }  
  15.       
  16.     @Override   
  17.     protected   void  onStart() {  
  18.         super .onStart();  
  19.         Log.e(TAG, "start onStart~~~" );  
  20.     }  
  21.       
  22.     @Override   
  23.     protected   void  onRestart() {  
  24.         super .onRestart();  
  25.         Log.e(TAG, "start onRestart~~~" );  
  26.     }  
  27.       
  28.     @Override   
  29.     protected   void  onResume() {  
  30.         super .onResume();  
  31.         Log.e(TAG, "start onResume~~~" );  
  32.     }  
  33.       
  34.     @Override   
  35.     protected   void  onPause() {  
  36.         super .onPause();  
  37.         Log.e(TAG, "start onPause~~~" );  
  38.     }  
  39.       
  40.     @Override   
  41.     protected   void  onStop() {  
  42.         super .onStop();  
  43.         Log.e(TAG, "start onStop~~~" );  
  44.     }  
  45.       
  46.     @Override   
  47.     protected   void  onDestroy() {  
  48.         super .onDestroy();  
  49.         Log.e(TAG, "start onDestroy~~~" );  
  50.     }  
  51.       
  52. }  

第三步:運行上述工程,效果圖如下(沒什麼特別的):

核心在Logcat視窗裏,如果你還不會用Logcat你可以看一下我的這篇文章 Log圖文詳解(Log.v,Log.d,Log.i,Log.w,Log.e) ,我們打開應用時先後執行了onCreate()->onStart()->onResume三個方法,看一下LogCat視窗如下:

BACK鍵:

當我們按BACK鍵時,我們這個應用程序將結束,這時候我們將先後調用onPause()->onStop()->onDestory()三個方法,如下圖所示:

HOME鍵:

當我們打開應用程序時,比如瀏覽器,我正在瀏覽NBA新聞,看到一半時,我突然想聽歌,這時候我們會選擇按HOME鍵,然後去打開音樂應用程序,而 當我們按HOME的時候,Activity先後執行了onPause()->onStop()這兩個方法,這時候應用程序並沒有銷燬。如下圖所示:

而當我們再次啓動ActivityDemo應用程序時,則先後分別執行了onRestart()->onStart()->onResume()三個方法,如下圖所示:

這裏我們會引出一個問題,當我們按HOME鍵,然後再進入ActivityDemo應用時,我們的應用的狀態應該是和按HOME鍵之前的狀態是一樣的,同樣爲了方便理解,在這裏我將ActivityDemo的代碼作一些修改,就是增加一個EditText。

第四步:修改main.xml佈局文件(增加了一個EditText),代碼如下:

  1. <?xml version= "1.0"  encoding= "utf-8" ?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"   
  3.     android:orientation="vertical"   
  4.     android:layout_width="fill_parent"   
  5.     android:layout_height="fill_parent"   
  6.     >  
  7. <TextView    
  8.     android:layout_width="fill_parent"    
  9.     android:layout_height="wrap_content"    
  10.     android:text="@string/hello"   
  11.     />  
  12. <EditText  
  13.     android:id="@+id/editText"   
  14.     android:layout_width="fill_parent"   
  15.     android:layout_height="wrap_content"   
  16. />  
  17. </LinearLayout>  

第五步:然後其他不變,運行ActivityDemo程序,在EditText裏輸入如"Frankie"字符串(如下圖:)

這時候,大家可以按一下HOME鍵,然後再次啓動ActivityDemo應用程序,這時候EditText裏並沒有我們輸入的"Frankie"字樣,如下圖:

這顯然不能稱得一個合格的應用程序,所以我們需要在Activity幾個方法裏自己實現,如下第六步所示:

第六步修改ActivityDemo.java代碼如下:

  1. package  com.tutor.activitydemo;  
  2. import  android.app.Activity;  
  3. import  android.os.Bundle;  
  4. import  android.util.Log;  
  5. import  android.widget.EditText;  
  6. public   class  ActivityDemo  extends  Activity {  
  7.      
  8.     private   static   final  String TAG =  "ActivityDemo" ;  
  9.     private  EditText mEditText;  
  10.     //定義一個String 類型用來存取我們EditText輸入的值   
  11.     private  String mString;  
  12.     public   void  onCreate(Bundle savedInstanceState) {  
  13.         super .onCreate(savedInstanceState);  
  14.         setContentView(R.layout.main);  
  15.         mEditText = (EditText)findViewById(R.id.editText);  
  16.         Log.e(TAG, "start onCreate~~~" );  
  17.     }  
  18.       
  19.     @Override   
  20.     protected   void  onStart() {  
  21.         super .onStart();  
  22.         Log.e(TAG, "start onStart~~~" );  
  23.     }  
  24.     //當按HOME鍵時,然後再次啓動應用時,我們要恢復先前狀態   
  25.     @Override   
  26.     protected   void  onRestart() {  
  27.         super .onRestart();  
  28.         mEditText.setText(mString);  
  29.         Log.e(TAG, "start onRestart~~~" );  
  30.     }  
  31.       
  32.     @Override   
  33.     protected   void  onResume() {  
  34.         super .onResume();  
  35.         Log.e(TAG, "start onResume~~~" );  
  36.     }  
  37.       
  38.     //當我們按HOME鍵時,我在onPause方法裏,將輸入的值賦給mString   
  39.     @Override   
  40.     protected   void  onPause() {  
  41.         super .onPause();  
  42.         mString = mEditText.getText().toString();  
  43.         Log.e(TAG, "start onPause~~~" );  
  44.     }  
  45.       
  46.     @Override   
  47.     protected   void  onStop() {  
  48.         super .onStop();  
  49.         Log.e(TAG, "start onStop~~~" );  
  50.     }  
  51.       
  52.     @Override   
  53.     protected   void  onDestroy() {  
  54.         super .onDestroy();  
  55.         Log.e(TAG, "start onDestroy~~~" );  
  56.     }  
  57.       
  58. }  

第七步:重新運行ActivityDemo程序,重複第五步操作,當我們按HOME鍵時,再次啓動應用程序時,EditText裏有上次輸入的"Frankie"字樣,如下圖如示:

OK,大功基本告成,這時候大家可以在回上面看一下Activity生命週期圖,我想大家應該完全瞭解了Activity的生命週期了,不知道你瞭解了沒?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章