Android Activity生命周期图谱
- activity类处于android.app包中,继承体系如下:
- java.lang.Object
- android.content.Context
- android.app.ApplicationContext
- android.app.Activity
-
从上图中可以看出Activity的生命周期包含两层循环,
onPasue -> onResume -> onPause 此为activity的焦点生命周期,意思是在activity焦点的获得与失去的过程中循环,在这过程中,activity始终是 可见的
onStop -> onRestart -> onStart ->onResume -> onPause -> onStop activity可见与不可见的过程中循环,此过程伴随着焦点的失去与获得,也就是说activity首先会被显示,或得焦点,失去焦点,最后由于弹出其它activity,使当前的activity变成不可见,由此出现3种生命周期 1.整体生命周期:onCreate -> ... ... ->onDestroy 2.可视生命周期:onStop -> ... ... -> onPasue 3.焦点生命周期:onPause -> ... ... -> onResume
- 详细说明
开始Activity:在这个阶段执行3个生命周期的方法:onCreate() -> onStart() -> onResume()
Activity失去焦点:如果Activity失去焦点的场景下进入其它的Activity,这时当前Activity失去焦点,在这个阶段,会执行onPause() - > onStop()方法
Activity重新获得焦点:如果Activity重新获得焦点,会依次执行3个生命周期:onRestart() -> onStart() -> onResume()
关闭Activity:当Activity被关闭时,系统会依次执行3个生命周期方法:onPause() -> onStop ->onDestroy()
- 七个生命周期方法及说明:
1. protected void onCreate(Bundle savedInstanceState) 当Activity被第首次加载时执行。我们新启动一个程序的时候其主窗体的onCreate事件就会被执行。如果Activity被销毁后(onDestroy后),再重新加载进Task时,其onCreate事件也会被重新执行。注意这里的参数 savedInstanceState(Bundle类型是一个键值对集合,大家可以看成是.Net中的Dictionary)是一个很有用的设计,由于前面已经说到的手机应用的特殊性,一个Activity很可能被强制交换到后台(交换到后台就是指该窗体不再对用户可见,但实际上又还是存在于某个Task中的,比如一个新的Activity压入了当前的Task从而“遮盖”住了当前的 Activity,或者用户按了Home键回到桌面,又或者其他重要事件发生导致新的Activity出现在当前Activity之上,比如来电界面),而如果此后用户在一段时间内没有重新查看该窗体(Android通过长按Home键可以选择最近运行的6个程序,或者用户直接再次点击程序的运行图标,如果窗体所在的Task和进程没有被系统销毁,则不用重新加载,直接重新显示Task顶部的Activity,这就称之为重新查看某个程序的窗体),该窗体连同其所在的 Task和Process则可能已经被系统自动销毁了,此时如果再次查看该窗体,则要重新执行 onCreate事件初始化窗体。而这个时候我们可能希望用户继续上次打开该窗体时的操作状态进行操作,而不是一切从头开始。例如用户在编辑短信时突然来电,接完电话后用户又去做了一些其他的事情,比如保存来电号码到联系人,而没有立即回到短信编辑界面,导致了短信编辑界面被销毁,当用户重新进入短信程序时他可能希望继续上次的编辑。**这种情况我们就可以覆写Activity的void onSaveInstanceState(Bundle outState)事件,通过向outState中写入一些我们需要在窗体销毁前保存的状态或信息,这样在窗体重新执行onCreate的时候,则会通过 savedInstanceState将之前保存的信息传递进来,此时我们就可以有选择的利用这些信息来初始化窗体,而不是一切从头开始。 **
2. protected void onStart() //activity变为在屏幕上对用户可见时调用 onCreate事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体前已经过去了一段时间,窗体已经执行了onStop事件,但是窗体和其所在进程并没有被销毁,用户再次重新查看窗体时会执行onRestart事件,之后会跳过onCreate事件,直接执行窗体的onStart事件
3. protected void onResume()//activity开始与用户交互时调用(无论是启动还是重新启动一个活动,该方法总是被调用的) onStart事件之后执行。或者当前窗体被交换到后台后,在用户重新查看窗体时,窗体还没有被销毁,也没有执行过onStop事件(窗体还继续存在于Task中),则会跳过窗体的onCreate和onStart事件,直接执行onResume事件
4. protected void onPause()//activity被暂停或收回cpu和其他资源时调用,该方法用于保存活动状态的,也是保护现场,压栈吧! 窗体被交换到后台时执行
5. protected void onStop()//activity被停止并转为不可见阶段及后续的生命周期事件时调用 onPause事件之后执行。如果一段时间内用户还没有重新查看该窗体,则该窗体的onStop事件将会被执行;或者用户直接按了Back键,将该窗体从当前Task中移除,也会执行该窗体的onStop事件
6. protected void onRestart() onStop事件执行后,如果窗体和其所在的进程没有被系统销毁,此时用户又重新查看该窗体,则会执行窗体的onRestart事件,onRestart事件后会跳过窗体的onCreate事件直接执行onStart事件
7. protected void onDestroy()//activity被完全从系统内存中移除时调用,该方法被调用可能是因为有人直接调用onFinish()方法或者系统决定停止该活动以释放资源 Activity被销毁的时候执行。在窗体的onStop事件之后,如果没有再次查看该窗体,Activity则会被销毁
- 详细说明
示例代码:
public class ActivityDemo extends Activity{
private static final String TAG = "ActivityDemo";
private EditText mEditText;
private String mString;//定义一个String类型用来存取我们的EditText输入值
////当Activity第一次被创建时调用,我们可以在这进行初始化操作
public void onCreate(Bundle saveInstanceState){
super.onCreate(saveInstanceState);
setContentView(R.layout.activity_main);
mEditText = (EditText)findViewById(R.id.editText);
Log.e(TAG,"start onCreate...");
}
//onStart()方法在Activity开始被执行时调用,它紧随onCreate()方法之后调用
@Override
protected void onStart(){
super.onStart();
Log.e(TAG,"start onStart...");
}
//当按HOME键,在启动应用程勋,要恢复当前的状态
//当Activity从stopped状态启动时会调用onRestart(),后面总是调用onStart()方法
@Override
protected void onRestart(){
super.onRestart();
mEditText.setText(mString);
Log.e(TAG,"start onRestart...");
}
//onResume()方法在Activity即将与用户交互时调用
@Override
protected void onResume(){
super.onResume();
Log.e(TAG,"start onResume...");
}
//按HOME键,在onPause,将输入的值赋给mString
//在一个Activity启动另一个Activity时调用,它通常被用来持久化数据、停止动画或其他耗费资源的动作,
//下一个Activity必须等待这个方法返回后在启动,所以在这里做过多的操作
@Override
protected void onPause(){
super.onPause();
mString = mEditText.getText().toString();
Log.e(TAG,"start onPause...");
}
//onStop()方法在一个新的Activity启动、其他的Activity切换到前台、当天Activity被销毁时都会被调用
@Override
protected void onStop(){
super.onStop();
Log.e(TAG,"start onStop...");
}
//Activitybe被销毁时调用
@Override
protected void onDestroy(){
super.onDestroy();
Log.e(TAG,"start onDestroy...");
}
}
-
启动程序调用方法:
-
按Home键,失去焦点被测程序放置后台挂起,方法如下:
-
当从后台挂起变更为前台展示,Activity获得焦点,方法如下:
-
关闭Avtivity时调用的方法: