activity生命周期
关于activity生命周期,google官方解释图
简单地说一下activity方法的调用顺序:从activity启动到activity被销毁:
onCreate()
onStart()
onResume()
前三个为新的Activity实例被创建至前台且用户可见事必须调用的三个方法,可视为一个整体,用CSR表示
onPause() //activity不在前台但仍可见
onStop() //activity不在前台且不可见
onDestroy() //完成或被销毁,之后activity实例不存在
如activity被意外地销毁但用户有想保留的数据,可调用onSaveInstanceState(Bundle outState)方法,该方法通常在onPause() ,onStop() ,onDestroy() 之前由系统调用
onSaveInstanceState(Bundle outState)保存的是bundle对象,bundle只能存储和恢复的数据类型只能是基本数据类型以及实现Serializable或者Parcelable接口的对象。onSaveInstanceState()保存下来的bundle对象实际上是传给onCreate()方法接收的
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
final AppCompatDelegate delegate = getDelegate();
delegate.installViewFactory();
delegate.onCreate(savedInstanceState);
if (delegate.applyDayNight() && mThemeId != 0) {
// If DayNight has been applied, we need to re-apply the theme for
// the changes to take effect. On API 23+, we should bypass
// setTheme(), which will no-op if the theme ID is identical to the
// current theme ID.
if (Build.VERSION.SDK_INT >= 23) {
onApplyThemeResource(getTheme(), mThemeId, false);
} else {
setTheme(mThemeId);
}
}
super.onCreate(savedInstanceState);
}
如果你看的博文或者资料上有onFreeze()这个方法,请记住这名字只是很久之前叫的,onFreeze()后来改名为onSaveInstanceState(),看见onFreeze()只能说明你看的资料很久很久了。那么onFreeze()或者onSaveInstanceState()算不算生命周期方法呢,如果按照google给的生命周期状态转换图的话,不算,所以生命周期的方法只有7个,分别是:onCreate,onStart,onResume,onPause,onStop,onReStart,onDestory
以下是常见情景下生命周期调用顺序
(CSR就是onCreate,onStart,onResume方法)
1.用户点击Home,Actvity调用顺序如下
CSR –> onSaveInstanceState() –> onPause() –> onStop() – Maybe –>onDestroy() – Maybe
2.父Activity启动子Activity,子Actvity退出,父Activity调用顺序如下
CSR –> onSaveInstanceState() –> onPause() –> onStop() –> onRestart()–> onStart()–>onResume()
3.调用finish(), Activity调用顺序如下
CSR –> onPause() –> onStop() –> onDestroy()
4.在Activity上显示dialog,Activity调用顺序如下
CSR
5.在父Activity上显示透明的或非全屏的activity,Activity调用顺序如下
CSR –> onSaveInstanceState() –> onPause()
6.设备进入睡眠状态,Activity调用顺序如下
CSR –> onSaveInstanceState() –> onPause()
基于用户体验考虑,android从不会为了回收内存而去销毁正在运行的activity。activity只有在onPause(),或者 onStop() 状态下才可能被销毁,此时会调用onSaveInstanceState()方法,这样,在需要恢复activity时,操作系统可以使用onSaveInstanceState()保存下来的数据重新激活activity。
以上仅为个人愚见,若有不正确的地方欢迎指出