Android學習筆記04——Activity的生命週期

GeekWay發表於2012-02-11

Android學習筆記04——Activity的生命週期


 
        下面是google官方給出的android生命週期圖:

Activity的7種生命週期:

          OnCreate():當Activity第一次建立的時候

OnStart()activity變為在螢幕上對使用者可見時呼叫。當Activity能被使用者看到時呼叫OnStarte()方法(Called when the activity is becoming visible to the user. )

OResume()activity開始與使用者互動時呼叫(無論是啟動還是重新啟動一個活動,該方法總是被呼叫的)

OnPause()Activity被其他Activity遮擋時呼叫此方法,即activity被暫停或收回cpu和其他資源時呼叫,該方法用於儲存活動狀態的,也是保護現場,壓棧。

OnStop()activity被停止並轉為不可見階段及後續的生命週期事件時呼叫。

OnRestart():重新啟動activity時呼叫。該活動仍在棧中,而不是啟動新的活動

OnDestroy()activity被完全從系統記憶體中移除時呼叫

  

注:這些方法都是OS自行呼叫的。



演示效果:


相關程式碼:
FirstActivity.java
package mars.activity04;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class FirstActivity extends Activity {
    /** Called when the activity is first created. */
	private Button myButton;
//下面覆寫了這7個生命週期的相關方法,並用System.out輸出動態顯示。
    @Override
    public void onCreate(Bundle savedInstanceState) {
    	System.out.println("FirstAcvity ---> onCreate");
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myButton = (Button)findViewById(R.id.myButton);
        myButton.setText("啟動第二個Activity");
        myButton.setOnClickListener(new ButtonOnClickListener());
    }

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onDestory");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onPause");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onRestart");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
    	System.out.println("FirstAcvity --->onStop");
		super.onStop();
	}
	
	class ButtonOnClickListener implements OnClickListener{

		@Override
		public void onClick(View v) {
			Intent intent = new Intent();
			intent.setClass(FirstActivity.this,SecondActivity.class);
			FirstActivity.this.startActivity(intent);  //啟動第二個Activity
		}
		
	}
	
}
secondActivity.java
package mars.activity04;

import android.app.Activity;
import android.os.Bundle;

public class SecondActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onCreate");
		super.onCreate(savedInstanceState);
		
	}

	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onDestory");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onPause");
		super.onPause();
	}

	@Override
	protected void onRestart() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onRestart");
		super.onRestart();
	}

	@Override
	protected void onResume() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		// TODO Auto-generated method stub
		System.out.println("SecondActivity--->onStop");
		super.onStop();
	}

}

點選第一個Activity按鈕時進入第二個Activity,再按返回鍵返回到第一個Activity時執行的相關操作:


 由圖可以看出,每啟動一個新的Activity都會呼叫3個方法(注:是OS呼叫的,不是手動寫的):
OnCreat(); //生成新的Activity時
OnStart(); //能被使用者看到時
OnResume(); //能獲得焦點的時候,也就是能點選按鈕,文字框時。

OnDestroy被呼叫的時機:

1Activity主動銷燬時

2、明確寫出了Activityfinish方法時。

3、當android系統資源不夠用時,會將優先順序較低的Activity銷燬掉。

 Activity與Task
     Android系統中Activity作為Activity棧(Stack)被管理的,大家都知道棧的特點是先進後出,所以當前活動的Activity處於棧頂,之前非活動的Activity被壓入棧底,等待是否可能被恢復為活動狀態。

Task就是一個棧,用於盛放各種Activity。

   應用程式啟動第一個Activity後,該Activity會被壓入到棧(Task)中,點選第二個Activity後,該Activity會被壓入到棧中記住一點,程式只會顯示在棧頂的Activity使用者體驗相當重要。
注意SecondActivity.this.finish();這句程式碼,會將SecondActivity從棧中踢出去,從而你在顯示ThirdActivity,點選返回按鈕時,會直接跳到FirstActivity去了。

當有對話方塊時,主Activity不會執行OnStop方法。

Activity能否被Kill掉?

在手機資源有限的情況下,作業系統會自動關閉某些Acitviy,說明這些Activity可以被killed掉。當一些Activity執行某些生命函式時,可以被殺掉。

Method

Killable?

Next

onCreate()

No

onStart()

    

onRestart()

No

onStart()

onStart()

No

onResume() oronStop()

    

onResume()

No

onPause()

onPause()

Pre-HONEYCOMB

onResume()or
onStop()

onStop()

Yes

onRestart()or
onDestroy()

onDestroy()

Yes

nothing




貝海拾遺:

1.設定過濾器的方法:

切換到DDMS檢視(右上角),在logcat裡點選“+”,在By log tag裡設定需要過濾出的資訊。

2.eclipse將專案從jdk 1.5版本升為jdk1.6版本的方法:

Project->Properties->Java Compiler->Configure Workspace Setting,在彈出的頁面中進行設定,將JDK1.5改為1.6,重新編譯後即可執行了。

3.對話方塊的配置:

程式碼很簡單,與其他控制元件設定一樣,只不過在AndroidMainfest.xml裡插入以下程式碼即可

<activity android:name="***"
          android:label="***"
          android:theme="@android:style/theme.Dialog"/>






相關文章