Activity作为android的四大组件之一,可以说是我们接触最多的。在android中,Activity是人机交互的窗口,负责用户意图的获取以及数据的显示。
Activity的生命周期
对于activity,它的生命周期,是必须了解掌握的。首先,是官方图:
//Activity
public class CustomActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_custom);
//一般在这个方法中加载布局。
}
@Override
protected void onStart() {
super.onStart();
//此时,activity可见,但不在前台。
}
@Override
protected void onResume() {
super.onResume();
// 此时,activity可见,在前台,可与用户交互。Activity可见时,
// 无论是新启动的,还是跳转回来的,都会执行这个方法。依据这个特性,
// 我们可以把一些页面的--更新工作--放到这里来。
// 比如,跳转回到这个activity,
// 需要作一次网络请求以更新数据这样的操作。
}
@Override
protected void onPause() {
super.onPause();
// Activity正在暂停。由于activity即将不可见,
// 在这里可以做一些临时数据的存储工作,
// 以便在之后onResume()的时候用到。
}
@Override
protected void onStop() {
super.onStop();
}
@Override
protected void onDestroy() {
super.onDestroy();
// Activity被摧毁。生命周期的最后一个回调,
// 在这里,需要释放资源(比如动态绑定了广播,在这里就需要解绑)。
}
@Override
protected void onRestart() {
super.onRestart();
// Activity重新可见时,会调用
}
}
关于几个方法的一些探索:
1.关于activity中函数的执行顺序
A可见状态下,启动另一个B,两个activity中的函数的执行顺序?
A.onPause()
B.onCreate()
B.onStart()
B.onResume()
A.onStop()
按下回退键返回A后,回调如下:
B.onPause()
A.onRestart()
A.onStart()
A.onResume()
B.onStop()
B.onDestroy()
2.Activity可见状态下,启动一个Dialog到前台?若是一个Activity样式的Dialog呢?
经实验,如果启动一个dialog,未引发Activity的生命周期。
若启动一个dialog样式的Activity,则触发如下:
A.onPause()
C.onCreate()
C.onStart()
C.onResume()
//注意,此时A并没有stop,仅仅只是pause了。
这时,如果按下回退键从而再返回到了A,则接下去回调如下:
C.onPause()
A.onResume()
C.onStop()
C.onDestroy()
//注意:这里A并没有onStop(),所以也就没有onRestart() onStart()
异常情况下的Activity生命周期
几种异常的情况:
1. 资源相关的系统配置发生改变导致Activity被杀死并重新创建
2. 资源内存不足,导致优先级低的Activity被杀死
比如,默认情况下,Activity从竖屏转化为横屏,此时Activity会被销毁并重建。(参考自《Android开发艺术探索》)
此时,所调用的生命周期如下:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
//用来保存Activity的当前状态,会将Bundle对象传给
//onCreate()、onRestoreInstanceState().
// 因此,可以用俩个方法中的bundle参数来判断,activity是否被重建
// (正常情况下,onCreate()中的参数savedInstanceState为null)。
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
//用来恢复数据
}