Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android系列教程之Activity的生命周期

Android系列教程之Activity的生命周期

編輯:關於Android編程

通過上一節“Android系列教程之Android項目的目錄結構”我們已經知道了什麼是Activity,那麼為什麼我們創建一個Activity的導出類的時候為什麼都要覆蓋Activity的onCreate方法呢,為什麼會在onPause()方法中保存一些當前Activity中的變化,要弄明白這些就要先了解Activity的生命周期,也就是一個Activity才開始到結束都要經過那些狀態,下面通過一個例子了解Activity的聲明周期. 一:Activity的生命周期方法  Android提供了很多Activity的生命周期方法,比如我們常用的onCreate、onPause、onResume等。這裡主要介紹粗粒度的周期方法,諸如onPostCreate、onPostResume等 這些細粒度的周期方法可以參考Android的API文檔,在你需要更細層次的控制的時候可以使用這些細粒度的方法。粗粒度的周期方法有以下幾個: onCreate()、onStart()、onResume()、onPause()、onStop()、onDestroy(),從名字上就可以看出來這些方法在什麼時候執行。 二:測試Activity的生命周期方法的執行順序 為了能更明白上這幾個周期放的執行順序,我們新建一個HelloWorld項目,在Activity中覆蓋這幾個方法,打印出日志就可以看出來執行順序了 1、新建HelloWorld項目 2、修改activity_main.xml代碼如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="vertical" >       <TextView         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="第一個Activity" />       <Button         android:id="@+id/second"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="打開第二個Activity" />   </LinearLayout> 這裡主要是為增加一個文本顯示和一個按鈕用於顯示信息和操作。 3、新建布局文件second.xml,內容如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:orientation="vertical" >       <TextView         android:layout_width="fill_parent"         android:layout_height="wrap_content"         android:text="第二個Activity" />       <Button         android:id="@+id/exit"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:text="退出" />   </LinearLayout> 這裡主要是為增加一個文本顯示和一個退出按鈕用於退出當前Activity。 4、新建一個Activity,名字為SecondActivity,要在AndroidManifest.xml也聲明一下,否則報錯: wKioL1Y7AjXysz9CAAI9RBv3NB8060.jpg SecondActivity類內容如下:  import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;   public class SecondActivity extends Activity{ private final static String TAG = "SecondActivity";   protected void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.second); //退出按鈕 Button btnExit = (Button) findViewById(R.id.exit); //為退出按鈕設置單擊事件 btnExit.setOnClickListener(new OnClickListener() {   @Override public void onClick(View arg0) { //關閉當前Activity,也就是退出 finish(); } }); } //覆蓋 android.app.Activity.onStart方法 protected void onStart(){ super.onStart(); Log.v(TAG, "onStart"); } //覆蓋 android.app.Activity.onResume protected void onResume(){ super.onResume(); Log.v(TAG, "onResume"); }   protected void onPause(){ super.onPause(); Log.v(TAG, "onPause"); }   protected void onStop(){ super.onStop(); Log.v(TAG, "onStop"); }   protected void onDestroy(){ super.onDestroy(); Log.v(TAG,"onDestroy"); }   } 我在各個周期方法裡都加了日志信息,便於跟蹤Activity的運行過程 5、修改HelloWorld類,內容如下: import android.os.Bundle; import android.app.Activity; import android.content.Intent; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button;   public class HelloWorld extends Activity { private final static String TAG = "HelloWorld"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //打開第二個Activity的按鈕 Button btnSecond = (Button) findViewById(R.id.second); btnSecond.setOnClickListener(new OnClickListener() {   @Override public void onClick(View arg0) { //跳轉到SecondActivity startActivity(new Intent(HelloWorld.this,SecondActivity.class)); finish();//關閉當前Activity } }); } /* * 重寫覆蓋 android.app.Activity裡的方法 *  */ protected void onStart(){ super.onStart(); Log.v(TAG, "onStart"); }   protected void onResume(){ super.onResume(); Log.v(TAG, "onResume"); }   protected void onPause(){ super.onPause(); Log.v(TAG, "onPause"); }   protected void onStop(){ super.onStop(); Log.v(TAG, "onStop"); }   protected void onDestroy(){ super.onDestroy(); Log.v(TAG,"onDestroy"); }   } 6、運行程序,分析結果,發現當程序啟動的時候,日志信息為下圖:       由此可見當打開一個Activity的時候,其周期方法執行順序為:onCreate()->onStart()->onResume(),現在點擊“打開第二個Activity”按鈕,看日志的輸出如下圖:     當應用從Helloworld這個Activity啟動SecondActivity的時候,Android會先執行HelloWorld的onPause方法,然後依次執行SecondActivity的onCreate()->onStart()->onResume()方法 當SecondActivity呈現到屏幕上的時候再一次執行Helloworld的onStop()->onDestroy(),把HelloWorld從Activity棧中移除銷毀。這裡值得提的就是HelloWorld 中finish方法,因為執行了他所以 HelloWorld才會從Activity棧中移除銷毀,這樣當你按“返回”鍵返回的時候就回不到HelloWorld 這個Activity的界面了,而是直接回到的Android的應用程序列表 。 三:分析結果 根據上面例子可見一個Activity在啟動的時候會執行onCreate()->onStart()->onResume(),在結束(或離開)的時候會執行onPause()->onStop()->onDestroy(),這就是一個Activity的生命周期。 因此我們要在onCreate方法裡把Activity的需要的東西准備好,也就是初始化;在onResume裡對Activity裡的東西做一些調整;在onPause做一些清理和保存工作(保存持久狀態),因為這是最後的 機會,因為onPause完成之前Android不會結束托管Activity類的進程,而之後進程可能被結束。總結一下這幾個周期方法的作用:   onCreate():創建Activity調用,用於Activity的初始化,還有個Bundle類型的參數,可以訪問以前存儲的狀態。 onStart():Activity在屏幕上對用戶可見時調用 onResume():Activity開始和用戶交互的時候調用,這時該Activity是在Activity棧的頂部。 onPause():Activity被暫停時調用,也就是你要對你能看到的這個Activity說byebye的時候調用,這裡可以做一些清理和保存工作 onStop():Activity被停止或者Activity變成不可見時調用 onDestroy():Activity被從內存中移除,一般發生在執行finish方法時或者Android回收內存的時候  
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved