Android Activity生命周期详解


今天通过实例方法系统的看了一下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才会变得不可见。

至此,我们的理解确实又上了一个层次了

相关内容