2012年1月26日 星期四

【Android】Activity的生命週期

可以用上面這張圖簡單解釋 Activity 的四個主要狀態

這對開發者而言,我們可以決定在什麼狀態作什麼事情,注意我們所撰寫的每一個Activity有繼承(extends)一個Activity類別,也因此我們可覆寫很多狀態的方法,例如以下:

publc void onCreate(Bundle savedInstanceState);  //initial > onStart()
publc void onStart();   //stop > active
publc void onResume();   //pause > active
publc void onPause();   //active > pause
publc void onStop();   //active > stop
publc void onDestroy();  //active > killed

回頭看看一開始的HelloWorldActivity.java,其實我們已經覆寫了一個方法了

public void onCreate(Bundle savedInstanceState)

onCreate()方法是每個Activity第一個被虛擬機呼叫的方法,它是你的Activity的入口點,通常都

是在這邊作一些初始化的動作(例如:設置頁面或變數)

至於在onCreate()方法中一定會呼叫setContentView();

這個就是告訴這支Activity它所對應的View是誰,以HelloWorldActivity.java為例

它的View就是R.layout.main 也就是 /res/layout/main.xml

所以,其實這個方法你也可以設定其他ActivityView

例如今天Hello_World project底下還有一個

XXXActivity.java 而它所對應的layoutxxx.xml

你也可以直接在HelloWorldActivity.java 這樣寫 > setContentView(R.layout.xxx)

這樣子你的HelloWorldActivity.java 所對應的View就會變成/res/layout/xxx.xml

因此透過setContentView你可以在你的Activity中作layout的切換,例如:當User在某個layout

button之後要切換另一個layout

甚至也可以設定這個Activity所對應的View是一個元件,例如:Button

super.onCreate(savedInstanceState);
Button button = new Button(this);
button.setText("Hello World");
setContentView(button);


接著用一個簡單的 Activity 來實作這些方法,並體會它的過程:
package org.sample.android;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class TestLifeCycleActivity extends Activity {
 
 private static final String LOG_TAG = TestLifeCycleActivity.class.getSimpleName(); 
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Log.i(LOG_TAG, "onCreate"); 
    }

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

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

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

 @Override
 protected void onStop() {
  // TODO Auto-generated method stub
  super.onStop();
  Log.i(LOG_TAG, "onStop"); 
 }
 
 @Override 
    protected void onDestroy() { 
        super.onDestroy(); 
        Log.i(LOG_TAG, "onDestroy "); 
    }
}
接著可以在 DDMS 的 LogCat中看到程式載不同狀態間切換的紀錄訊息




沒有留言:

張貼留言