Android Activity生命週期詳解

鴨脖發表於2012-07-15
今天通過例項方法系統的看了一下activity的宣告週期。就是把整個過程的狀態log出來。或者通過對話方塊顯示出來。


原始碼貼出來:
注:另一個activity的程式碼沒有貼,大家隨便寫。注意activity的註冊
package com.yelbosh.test;


import com.yelbosh.test.classes.MyButton;


import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Resources;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import android.support.v4.app.NavUtils;
import android.webkit.*;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends Activity {
private AlertDialog.Builder builder;
private int count=0;
private final String TAG = "log";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn1 = (Button)findViewById(R.id.button1);
        builder = new AlertDialog.Builder(this);
        
        builder.setMessage("你確定這麼做嗎親?").
        /**
         * 肯定的按鈕函式
         */
        setPositiveButton("Yes", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub

}
}).
/**
* 否定的按鈕函式
*/
setNegativeButton("No", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub

}
});
        builder.setMessage("OnCreate" + (count++));
        builder.create().show();
        Log.i(TAG,"oncreate");
        
        
        btn1.setOnClickListener(new View.OnClickListener() {

public void onClick(View arg0) {
// TODO Auto-generated method stub
/**
        * 通過dialog的builder來構造視窗
        */
       Intent intent = new Intent();
       intent.setClass(MainActivity.this, SubActivity1.class);
       startActivity(intent);
}
});
        
    }
    
    
    /**
     * 當activity變得對使用者可見的時候被呼叫
     */
    @Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
builder.setMessage("onStart"  + (count++));
builder.create().show();
Log.i(TAG,"onstart");
}


    
/**
 * 當activity變得對使用者不可見的時候被呼叫
 */
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onStop();
builder.setMessage("onStop"   + (count++));
builder.create().show();
Log.i(TAG,"onstop");
}


/**
     * 當介面準備和使用者互動的時候被呼叫
     */
    @Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
builder.setMessage("OnResume"  + (count++));
builder.create().show();
Log.i(TAG,"onresume");
}
    
    /**
     * 當系統準備建立另一個螢幕的時候被呼叫
     */
    @Override
    protected void onPause(){
    //TODO Auto-generated method stub
    super.onPause();
    builder.setMessage("onPause"  + (count++));
    builder.create().show();
    Log.i(TAG,"onpause");
    }
    
   
    
    /**
     * 當activity被銷燬的時候被呼叫
     */


@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
builder.setMessage("onDestroy"  + (count++));
builder.create().show();
Log.i(TAG,"ondestroy");
}


/**
* 當activity被再次呼叫的時候被呼叫
*/
@Override
protected void onRestart() {
// TODO Auto-generated method stub
super.onRestart();
builder.setMessage("onRestart"  + (count++));
builder.create().show();
Log.i(TAG,"onrestart");
}




@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }


    
}


執行結果,除了logcat的整個過程之外,通過對話方塊也可以看出整個過程。
當程式的第一個activity開始和使用者互動之前,分別依次執行onCreate方法(建立activity),onStart方法(變得可見),onResume方法(開始互動)
然後這個時候點選跳轉的按鈕,會依次執行onPause方法(程式準備建立目標activity),onStop方法(先前的activity變得不可見),
這個時候已經跳轉到目標activity了,這個時候按下返回鍵,這個時候會呼叫先前的activity的onRestart方法(當重新返回這個activity的時候),然後onstart,onresume。


不過話又說回來了,目標activity的建立過程是在什麼時候建立的呢?由於先前的onPause方法是在準備建立目標activity之前呼叫的,所以我們猜測onCreate方法是在onPause方法之後呼叫的。那麼其他方法呢?還是log出來吧,log出來之後,發現目標activity的onresume方法(包括onResume)之前的過程都是在原先的activity的onPause和onStop方法之間呼叫的,這也意味著,當目標activity建立完畢並且準備和使用者互動的時候,先前的activity才會變得不可見。


至此,我們的理解確實又上了一個層次了

相關文章