Android Activit生命週期方法

SUNEudemon發表於2014-07-14

Activity的生命週期方法不需要開發者呼叫,框架會自動來呼叫這些方法,理解Activity的生命週期及這些方法可以對我們的開發有很大的幫助。

首先建立一個工程,然後重寫Acitvity的各個生命週期方法,在裡邊用Log輸入當前方法名

package com.example.activitytest;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.fragment_main);
		Log.i("info", "First activity onCreate");

	}

	@Override
	protected void onRestoreInstanceState(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onRestoreInstanceState(savedInstanceState);
		Log.i("info", "First activity onRestoreInstanceState");
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
		Log.i("info", "First activity onStart");
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		super.onResume();
		Log.i("info", "First activity onResume");
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		super.onPause();
		Log.i("info", "First activity onPause");
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		super.onStop();
		Log.i("info", "First activity onStop");
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		super.onRestart();
		Log.i("info", "First activity onRestart");
	}

	@Override
	protected void onSaveInstanceState(Bundle outState) {
		// TODO Auto-generated method stub
		super.onSaveInstanceState(outState);
		Log.i("info", "First activity onSaveInstanceState");
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		Log.i("info", "First activity onDestroy");
	}

}

執行程式碼,可以看到在Logcat裡列印出“First activity onCreate”→“First activity onStart”→“First activity onResume”,可以看到執行順序為“oncreate”,"onstart",“onResume”,當按電源鍵關閉螢幕或者按“home”鍵切換的桌面的時候,會呼叫“First activity onPause”→"First activity onSaveInstanceState"→"First activity onStop"。當前Activity處於半透明或在完全不可見之前會呼叫onPause方法,在此之後會呼叫onSaveInstanceState來儲存當前Activity的狀態,最後再呼叫onStop方法,此時該Activity已經完全不可見。注意:此時該Actvity並沒有被銷燬。當我們再次點選程式圖示的時候就會執行“First activity onRestart”→"First activity onStart"→“”First activity onResume。現在可以看一下程式跟第一次執行時的不同,在第一次執行時首先會執行“oncreate”方法,並沒有執行“onrestart”方法,當程式切到後臺,再次切回來的時候發現“oncreate”並沒有執行,“onrestart”執行了。所以我們在寫程式碼的時候要考慮哪些程式碼應該寫在onCreate裡,哪些應該寫在onRestart裡。

當我們在Activity的可見狀態下按“back”鍵,會執行“First activity onPause”→"First activity onStop"→“First activity onDestroy”,此時Activity被銷燬,該Activity的生命週期結束。

Activity的完整生存週期是指對oncreate方法的第一次呼叫和對ondestroy方法的最後一次呼叫之間的時間範圍。有時候還會發生一個Activity的程式被終止,卻沒有呼叫onDestroy方法的情況。

使用oncreate方法來初始化Activity:填充使用者介面,得到對Fragment的引用,分配對類變數的引用,將資料繫結到控制元件,並啟動Service和定時器。如果Activity被執行時意外終止,oncreate方法接受一個包含UI狀態的Bundle物件,該物件是在最後一次呼叫onSaveInstanceState時儲存的,應該使用這個Bundle將UI恢復為上一次的狀態,這裡既可以通過oncrate方法,也可以通過重寫onRestoreInstanceState來實現。

通過ondestroy方法來清理oncreate建立的所有資源,並保證所有的外部連線(例如,網路或者資料庫連線)都關閉了。

作為使用Android編寫高效程式碼的指導原則的一部分,我們建議最好避免建立短期物件。物件的快速建立和銷燬會導致額外的垃圾收集過程,而這個過程會對使用者體驗產生直接的影響。如果Activity是有規律地建立相同的物件集,那麼可以考慮在oncreate方法中建立他們,因為它只在Activity的生存週期中被呼叫一次。



注:部分摘自其他資料

相關文章