夢幻之旅

          DEBUG - 天道酬勤

             :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            671 隨筆 :: 6 文章 :: 256 評論 :: 0 Trackbacks

          大家好,今天給大家詳解一下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的生命周期了,不知道你了解了沒?

          posted on 2013-04-20 13:41 HUIKK 閱讀(296) 評論(0)  編輯  收藏 所屬分類: Android
          主站蜘蛛池模板: 三都| 颍上县| 龙井市| 甘谷县| 利辛县| 霍林郭勒市| 阜平县| 濉溪县| 泗水县| 亚东县| 南和县| 宜宾市| 彭州市| 工布江达县| 河津市| 喀什市| 绥阳县| 随州市| 郁南县| 遂溪县| 宁明县| 平湖市| 新竹县| 乌苏市| 泸州市| 抚宁县| 康定县| 凉城县| 涡阳县| 垫江县| 永吉县| 普格县| 手游| 新野县| 时尚| 乌兰浩特市| 天镇县| 北辰区| 昌吉市| 科技| 舟曲县|