初学者来理解Activity的生命周期,可能不会马上产生多大的感触,甚至会不解为什么要有生命周期这种机制。但是随着慢慢深入Andorid的应用开发,你会发现它的重要性。
Activity的三种状态
Activity有三种状态,分别是运行状态、暂停状态以及停止状态。
运行状态:
当Activity在屏幕的最前端(位于当前堆栈的顶部),它是可见的、有焦点的。可以用来进行处理用户的操作(点击、双击、长按等),那么就叫做激活或运行状态。值得注意的是,当Activity处于运行状态的时候,Android会尽可能的保持它的运行,即使出现内存不足
等情况,Android也会先杀死堆栈底部的Activity,来确保运行状态的Activity正常运行。
暂停状态:
在某些情况下,Activity对用户来说,仍然是可见的,但不再拥有焦点,即用户对它的操作是没用实际意义的。在这个时候,它就是属于暂停状态。例如:当最前端的Activity是个透明或者没有全屏,那么下层仍然可见的Activity就是暂停状态。暂停的Activity仍然是激活的(它保留着所有的状态和成员信息并保持与Activity管理器的连接),但当内存不足时,可能会被杀死。
停止状态:
当Activity完全不可见时,它就处于停止状态。它仍然保留着当前状态和成员信息。然而这些对用户来说,都是不可见的;同暂停状态一样,当系统其他地方需要内存时,它也有被杀死的可能。
生命周期事件:
Activity状态的变化是人为操作的,而这些状态的改变,也会触发一些事件。我们且叫它生命周期事件。一共有7个。
void onCreate(Bundle savedInstanceState)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
当打开一个Activity,如果该Activity实例不存在于Activity管理器中,就会触发onCreate事件。注意,Activity的实例不是我们自己创建的,是Android系统自己创建的。接下来是onStart事件,然后是onResume事件,此时Activity就处于了运行状态。
首先要重写7个相应被触发的方法,以日志的形式输出相应的事件信息。然后添加两个Button,一个用来启动新的Activity,另一个是用来退出当前Activity。
这里对生命周期做一个总结:
1.Activity从创建到进入运行状态所触发的事件:
onCreate() àonStart() àonResume()
2.当Activity从运行状态到停止状态所触发的事件:
onPause() àonStop()
3.当Activity从停止状态到运行状态所触发的事件:
onRestart()àonStart()àonResume()
4. 当Activity从运行状态到暂停状态所触发的事件:
onPause()
5. 当Activity从暂停状态到运行状态所触发的事件:
onResume()
举例:
第一:
1、运行activity之后的状态转换:
package cn.lyhz;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class TestActivity extends Activity {
private static final String TAG = "myTest";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG,"onCreate");
}
protected void onDestroy() {
//Log.i(TAG,"onDestroy");
super.onDestroy();
}
protected void onPause() {
Log.i(TAG,"onPasume");
super.onPause();
}
protected void onRestart() {
Log.i(TAG,"onRestart");
super.onRestart();
}
protected void onResume() {
Log.i(TAG,"onResume");
super.onResume();
}
protected void onStart() {
Log.i(TAG,"onstrat");
super.onStart();
}
protected void onStop() {
Log.i(TAG,"onStop");
super.onStop();
}
}
2、点击红色圈住得那个按钮(返回键),会发生的状态是
onPasume—onStop—onDestroy
一般不会发生onDestroy事件,除非是有意的把一个activity关闭,Destroy之后是无法再返回的。
点击小房子后,运行的状态为onPesume—onStop,这是压栈的过程
返回之后再长按home键(小房子)重新回到activity,它的运行状态是onRestart—onStart—onResume,也就是出栈的过程。
第二:
写两个activity互相切换
package cn.lyhz;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class SecondActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.seconde);
Button backB = (Button)findViewById(R.id.backB);
backB.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(SecondActivity.this,FirstActivity.class);
startActivity(intent);
}
});
}
}
点击按钮,运行组状态是onPasume—onStop会切换到另一个界面。
点击返回按钮,它的运行状态是onCreate—onStart—onResume,点击手机自带的返回按钮的运行状态是
onRstart—onStart—onResume(这是出栈的过程)
第三:(半透明定的效果,创建了一个对话框样式activity)
点击this is maDialog按钮就会出现这个结果,这是的状态为onPesume暂停状态,这是把它放到了栈里面。再点击手机自带的返回按钮,他回出栈,状态为onResume
2、
package cn.lyhz;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class FirstActivity extends Activity {
private static final String TAG = "myTest";
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.i(TAG,"onCreate");
Button goB = (Button)findViewById(R.id.goB);
goB.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,SecondActivity.class);
startActivity(intent);
}
});
Button showMyDialog = (Button)findViewById(R.id.showMyDialog);
showMyDialog.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(FirstActivity.this,DialogActivity.class);
startActivity(intent);
}
});
Button showAlertDialogB = (Button)findViewById(R.id.showAlertDialog);
showAlertDialogB.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
showAlertDialog();
Log.i(TAG,"showAlertDialog");
}
});
}
public void showAlertDialog(){
AlertDialog.Builder builder = new Builder(FirstActivity.this);
builder.setMessage("确认退出么?");
builder.setTitle("提示");
builder.setPositiveButton("确定",
new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
FirstActivity.this.finish();
}
});
builder.setNegativeButton("
取消", new android.content.DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});
builder.create().show();
}
protected void onDestroy() {
Log.i(TAG,"onDestroy");
super.onDestroy();
}
protected void onPause() {
Log.i(TAG,"onPasume");
super.onPause();
}
protected void onRestart() {
Log.i(TAG,"onRestart");
super.onRestart();
}
protected void onResume() {
Log.i(TAG,"onResume");
super.onResume();
}
protected void onStart() {
Log.i(TAG,"onstrat");
super.onStart();
}
protected void onStop() {
Log.i(TAG,"onStop");
super.onStop();
}
}
创建的真正的对话框点击取消是没有任何反应的(不能触发FirstActivity的状态),而点击确定状态是onPesume—onStop—onDestro
2011年12月11日