夢(mèng)幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評(píng)論 :: 0 Trackbacks

          大家好,今天給大家詳解一下Android中Activity的生命周期,我在前面也曾經(jīng)講過這方面的內(nèi)容,但是像網(wǎng)上大多數(shù)文章一樣,基本都是翻譯Android API,過于籠統(tǒng),相信大家看了,會(huì)有一點(diǎn)點(diǎn)的幫助 ,但是還不能完全吃透,所以我今天特意在重新總結(jié)一下.

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

           

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

          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.    }  

           

           

          為了便于大家更好的理解,我簡單的寫了一個(gè)Demo,不明白Activity周期的朋友們,可以親手實(shí)踐一下,大家按照我的步驟來。

          第一步:新建一個(gè)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. }  

           

           

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

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

          BACK鍵:

          當(dāng)我們按BACK鍵時(shí),我們這個(gè)應(yīng)用程序?qū)⒔Y(jié)束,這時(shí)候我們將先后調(diào)用onPause()->onStop()->onDestory()三個(gè)方法,如下圖所示:

          HOME鍵:

          當(dāng)我們打開應(yīng)用程序時(shí),比如瀏覽器,我正在瀏覽NBA新聞,看到一半時(shí),我突然想聽歌,這時(shí)候我們會(huì)選擇按HOME鍵,然后去打開音樂應(yīng)用程序,而當(dāng)我們按HOME的時(shí)候,Activity先后執(zhí)行了onPause()->onStop()這兩個(gè)方法,這時(shí)候應(yīng)用程序并沒有銷毀。如下圖所示:

          而當(dāng)我們?cè)俅螁?dòng)ActivityDemo應(yīng)用程序時(shí),則先后分別執(zhí)行了onRestart()->onStart()->onResume()三個(gè)方法,如下圖所示:

           

          這里我們會(huì)引出一個(gè)問題,當(dāng)我們按HOME鍵,然后再進(jìn)入ActivityDemo應(yīng)用時(shí),我們的應(yīng)用的狀態(tài)應(yīng)該是和按HOME鍵之前的狀態(tài)是一樣的,同樣為了方便理解,在這里我將ActivityDemo的代碼作一些修改,就是增加一個(gè)EditText。

           

          第四步:修改main.xml布局文件(增加了一個(gè)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>  

           

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

           

          這時(shí)候,大家可以按一下HOME鍵,然后再次啟動(dòng)ActivityDemo應(yīng)用程序,這時(shí)候EditText里并沒有我們輸入的"Frankie"字樣,如下圖:

          這顯然不能稱得一個(gè)合格的應(yīng)用程序,所以我們需要在Activity幾個(gè)方法里自己實(shí)現(xiàn),如下第六步所示:

          第六步修改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.     //定義一個(gè)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.     //當(dāng)按HOME鍵時(shí),然后再次啟動(dòng)應(yīng)用時(shí),我們要恢復(fù)先前狀態(tài)  
          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.     //當(dāng)我們按HOME鍵時(shí),我在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. }  

           

          第七步:重新運(yùn)行ActivityDemo程序,重復(fù)第五步操作,當(dāng)我們按HOME鍵時(shí),再次啟動(dòng)應(yīng)用程序時(shí),EditText里有上次輸入的"Frankie"字樣,如下圖如示:

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

          posted on 2013-04-20 13:41 HUIKK 閱讀(296) 評(píng)論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 松桃| 汪清县| 闻喜县| 且末县| 左贡县| 尖扎县| 孟村| 枝江市| 固安县| 永宁县| 兴城市| 遵义县| 喀喇| 临泉县| 常德市| 会同县| 普兰店市| 河津市| 阿拉善左旗| 玉龙| 洪湖市| 临桂县| 民和| 嘉荫县| 沙湾县| 镇巴县| 拉孜县| 确山县| 泰安市| 呼伦贝尔市| 亚东县| 龙门县| 太和县| 堆龙德庆县| 广安市| 三河市| 彝良县| 馆陶县| 黄大仙区| 青神县| 祁连县|