Activity,作为android最基本组件之一,其生命周期对初学者来说往往是一个比较概念性的东西,在面试中也经常会碰到这样那样的生命周期问题。但是Android为什么要有生命周期这种机制?
Activity有三种状态:
1.运行状态:
当Activity在屏幕的最前端时(位于当前堆栈的顶部),它是可见的,有焦点的,可以用来处理用户操作。Android内核会尽全力来保证运行状态的Activity运行。
2.暂停状态:
在某些情况下,Activity对用户来说还是可见的,只是没有焦点,这时候Activity处于暂停状态。例如当最前端的Activity是半透明或者Dialog形式,没有全部遮挡后面的 Activity。这时后面的Activity是可见的,处于暂停状态。当内存不足时,可能会被杀死。
3.停止状态:
当Activity完全不可见时,它就处于停止状态。当内存不足时,可能会被杀死。
Activity的生命周期事件:7个
- void onCreate(Bundle saveInstanceState);
- void onStart();
- void onRestart();
- void onResume();
- void onPause();
- void onStop();
- void onDestory();
下面是Google官方文档里提供的Activity生命周期的图解
当打开一个Activity时,首先触发的是onCreate()->onStart()->onResume() 此时Acitivity处于运行状态。
下面通过代码在控制台输出LOG信息来更明了的观察Activity的生命周期
ActivityLifeActivity:
View Code
package com.wudi.life;
import android.app.Activity;
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 ActivityLifeActivity extends Activity {
/** Called when the activity is first created. */
Button other,exit;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
other=(Button)findViewById(R.id.button1);
exit=(Button)findViewById(R.id.button2);
other.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
startActivity(new Intent(ActivityLifeActivity.this,OtherActivity.class));
}
});
exit.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
finish();
}
});
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
Log.i("info", "onStart");
super.onStart();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
Log.i("info", "onRestart");
super.onRestart();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
Log.i("info", "onResume");
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.i("info", "onPause");
super.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Log.i("info", "onStop");
super.onStop();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.i("info", "onDestory");
super.onDestroy();
}
}
代码中重写了Activity的7个生命周期方法,并且有两个按钮,other用于跳转到OtherActivity, exit用于退出当前Activity
OtherActivity:
View Code
package com.wudi.life;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
public class OtherActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
Log.i("info", "Other-onCreate");
TextView tv=new TextView(this);
tv.setText("other activity");
setContentView(tv);
}
@Override
protected void onStart() {
// TODO Auto-generated method stub
Log.i("info", "Other-onStart");
super.onStart();
}
@Override
protected void onRestart() {
// TODO Auto-generated method stub
Log.i("info", "Other-onRestart");
super.onRestart();
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
Log.i("info", "Other-onResume");
super.onResume();
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
Log.i("info", "Other-onPause");
super.onPause();
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
Log.i("info", "Other-onStop");
super.onStop();
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
Log.i("info", "Other-onDestory");
super.onDestroy();
}
}
我们首先把OtherActivity设置成Dialog样式来观察生命周期的调用
AndroidManifest.xml
<activity android:name=".OtherActivity" label="other"
android:theme="@android:style/Theme.Dialog">activity>
程序运行时:
当点击exit或者按下返回键时:
可见Activity在退出时:onPause()->onStop()->onDestory()
当点击other时:跳转到新的activity,但之前的Activity还处于可见状态,只是失去焦点。此时为暂停状态。
此时ActivityLifeActivity处于暂停状态,调用onPause(),OtherActivity处于运行状态
如果把OtherActivity的样式改为默认
<activity android:name=".OtherActivity" label="other">activity>
再查看控制台的相关信息
比暂停状态多触发一个onStop(),此时ActivityLifeActivity处于停止状态。
在OtherActivity按下返回键
由此可见
1.当Activity从创建到运行状态:onCreate()->onStart()->onResume().
2.当Activity从运行状态到停止状态:onPause()->onStop()->onDestory().
3.当Activity从停止状态到运行状态:onRestart()->onStart()->onResume().
4.当Activity从运行状态到暂停状态:onPause().
5.当Activity从暂停状态到运行状态:onResume().
生命周期看似简单。运用起来就要看你对它的理解了。当有一些在应用创建初期就要处理好的事情。可以放在onCreate()中执行,或者在关闭程序前你有一些数据保存要做,可以放在onStop()中,在相应的时期做相应的事件,便于管理,也让程序的执行有条不紊。而且可以更加安全高效的进行内存管理,合理的使用释放内存,比如在Activity销毁时将用到的cursor,打开的文件进行释放。使手机运行在最佳状态。