Activity的生命週期

Activity的生命週期

    前面一篇講了Android的Application使用,下面就我個人總結一下自己對Activity的理解

    1.Activity是幹什麼的?

       Activity是android四個組件之一,那麼Activity在android中起到了什麼作用了?我們在玩安卓手機時,進入某一個APP,很看到很多個界面,每一個能看到的界面就是一個Activity裏,android3.0引入了fragment(碎片),看到的界面有可能是一個fragment,而每一個fragment都必須依賴於一個Activity,在這裏我們不考慮fragment,後面在講fragment的使用方法,生命週期以及它和Activity之間的關係。這裏我們主要講解Activity的生命週期及其使用。Activity就是能和我們人交互的界面,也是我們通常在手機上面看到的界面,我們點擊手機的某一個按鈕,做出交互動作的界面。


    2.Activity的生命週期

       那我們先來看一張android關於Activity生命週期的圖

      如果是一個剛剛接觸android的開發人員,看這張圖可能有點摸不清頭腦,不要緊,接下來我會從Activity start的地方開始講起,讓你更加深刻的瞭解Activity是怎麼運作的。好了,廢話不說了,從Activity 的start開發。

      先看整張圖,我們可以知道了,Activity的生命週期中會有七個方法分別是
      oncreate(),  onstart(),  onresume(),  onpause(),  onstop(),  onrestart,  ondestroy()先不談這七個方法。

      假如我們在安卓手機上面安裝了一個APP,此時我們想用這個APP,通過上篇文章可以知道,啓動APP會去調用Application中的onCreate方法, 之後就會有一個界面顯示在我們先前,那麼爲什麼這個界面顯示,而不是其它的界面優先顯示了,我們可以打androidmanfest.xml文件看看

<application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name" >
        <activity
            android:name="com.simple.fan.MainActivity">
            <intent-filter >
                <action android:name="android.intent.action.VIEW"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>

       <activity  android:name="com.simple.fan.SecondActivity"/>
    </application>

     我們看到了兩個Activity,但是這兩個Activity標籤不一樣,MainActivity多一點點東西,<intent-filter>這個標籤中的定義的兩個子標籤,正是因爲這兩個子標籤就告訴了APP最開始顯示這個Activity,那麼就是啓動了MainActivity,就回到了我們上圖中看到的Activity start處,然後Activity會繼續運行,顯示一個很漂亮的界面在我們眼前,這個過程中調用上圖中onCreate()-->onStart()-->onResume() 三個方法,之後這個Activity就停留在onresume處,我們點擊界面中某一個按鈕跳轉到其它界面時,MainActivity就會緊接着調用onPause()-->onStop()兩個方法,而新啓動的SecondActivity就會跟剛剛講到的一樣,調用onCreate()-->onStart()-->onResume方法,如果此時我們按返回鍵,那麼SecondActivity就會從出棧(後面講到,管理Activity),此時SecondActivity會用調用onPause()-->onStop()-->onDestroy()方法,此時這個Activity就被銷燬了,因爲調用了onDestroy就銷燬Activity,而在MainActivity中會調用onRestart()-->onStart()-->onResume()等三個兩個,通過觀察,我們看到了,onCreate方法只調用了一邊,而回到MainActivity中時,調用了onRestart方法,而如果我們此時在點擊返回鍵,在MainActivity中就會調用onPause()-->onStop()-->onDestroy()。此時我們已經做了兩個Activity的正常生命週期的調用,SecondActivity和MainActivity。

      我們仔細看看剛剛的調用過程,會發現七個函數都調用了,當停留在某一個界面時,就會處在當前Activity的onResume處,而跳轉是隱藏掉的Activity就會處在onStop處,Activity退出後就會調用destroy銷燬當前Activity。但是我們仔細看看上圖,好像有一條路我沒有做,就是從onPause-->onResume兩個,那麼這種情況什麼時候發生了,就是當我們跳轉Activity時,準備跳轉的Activity的跳轉後,還能顯示在我們能看到界面中,就好像被另一個Activity的壓住了,但是它又沒有完全被擋,此時被擋出的Activity處在onPause處,當點擊返回鍵時,被擋住的Activity的就會走onResume方法了。最後一箇中狀態就是我們APP打開太多了的時候,因爲內存不足的原因,會被系統kill掉。

      Activity生命週期的四中情況講完了,那麼接下來講每一個方法到底怎麼用。

      onCreate  在這個方法中一般都是做一些初始化工作,因爲這個方法只會被調用一次

      onStart    Activity創建或者從後臺重新回到前臺時被調用

      onResume   Activity創建或者從被覆蓋、後臺重新回到前臺時被調用,一般是用來重新刷新UI

      onPause    Activity被覆蓋到下面或者鎖屏時被調用

      onStop    退出當前Activity或者跳轉到新Activity時被調用

      onDestroy    退出當前Activity時被調用,調用之後Activity就結束,一般用來銷燬數據

      如果是被系統kill掉了,就會調用onRestoreInstanceState方法,一般用來保存非法狀態下被系統kill掉了,保存數據供下來進入時使用。

   

       3代碼

     

public class MainActivity extends Activity {
	
	private static final String TAG = "simple";
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main_activity);
		Log.i(TAG, "MainActivity method : onCreate");
	}

	@Override
	protected void onStart() {
		super.onStart();
		Log.i(TAG, "MainActivity method : onStart");
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		Log.i(TAG, "MainActivity method : onRestart");
	}

	@Override
	protected void onResume() {
		super.onResume();
		Log.i(TAG, "MainActivity method : onResume");
	}

	@Override
	protected void onPause() {
		super.onPause();
		Log.i(TAG, "MainActivity method : onPause");
	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.i(TAG, "MainActivity method : onStop");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.i(TAG, "MainActivity method : onDestroy");
	}
      每一個方法在上面都講了,就不寫註釋了。



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