今天通過實例方法系統的看了一下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才會變得不可見。
至此,我們的理解確實又上了一個層次了