本系列文章一共三篇,第一张讲activity正常生命周期,第二篇讲activity异常的生命周期
正常情况activity的生命周期
一共有七个生命周期方法,直接插入代码
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } @Override protected void onStart() { super.onStart(); } @Override protected void onResume() { super.onResume(); } @Override protected void onPause() { super.onPause(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onRestart() { super.onRestart(); }
1,首先 oncreate方法,一个activity对象(注意是一个对象,不是一个类的对象)的oncreate 方法和只会走一次,当activity创建的时候oncreate 方法会被回调
这个方法去加载布局文件,可以设置主题样式等等,我们开发可以把view的绑定以及view事件设置,在这个方法中完成
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); setEvent(); } private void initView() { } private void setEvent() { }
(个人写法,也可以写在一个方法当中)。
2,当oncreate方法执行完之后 onstart方法会被回调到,当前activity 已经可见了,但是还没有获取焦点,我们并不能和它进行交互,onstart方法在一个activity对象的生命周期中可能会被调用多次,只要是当activity从后台往前台显示的时候就回调此方法,例如两个activity之间切换的时候
3,onresume当activity 调用了onstart方法之后activity虽然可见但是不能交互,马上接下来就回调onresume,这个时候当前activity对象就已经正常显示,并且可以交互了。
4,onPause方法被回调,activity失去焦点,但是任然可见,这个方法中我们可以做一下简单的资源释放,但是不能耗时,
5,onstop方法被回调,此时activity对象已经不可见,也可以在此方法中释放一些简单的资源,记住不能耗时
6,ondestroy方法被回调,然后activity被销毁,此方法我们主要做的就是释放资源,相对于前两个这个需要把所有的资源释放,
如果不释放可能会造成内存泄漏,所以这个方法当中主要的作用也就是释放资源文件,(简单说一下内存泄漏的原因,当activity要被销毁之前,首先会把当前activity对象从整个activity回退栈中移除它的引用,但是activity对象还存留在内存当中,这个时候才会调用ondestroy方法 ,如果你在方法中没有释放资源,其他还有一些生命周期和app一样长的对象,例如单例,静态,等,持有着当前activity对象,就会导致gc的时候不能够及时回收,activity中的所有对象分配的内存就不能及时回收,导致内存泄漏,当你频繁启动这个activity的时候就会导致应用可用的内存越来越少,最后oom)
7onrestart ,当activity对象从不可见变为可见一般都会回调这个方法,大多数因为用户操作导致,当用户打开一个activity之后,按了home键,在返回当前页面的时候就不会从新创建对象,所以不会走oncreate对象,onrestart方法会被回调
简单介绍一下方法的作用和实际触发的效果
下面说一下生命周期的场景,
场景一
启动一个activity 然后按返回键
oncreate ,onstart,onresume,onpause,onstop,ondestroy
场景二
启动一个activity 然后按Home键,在返回应用
oncreate ,onstart,onresume,onpause,onstop,onrestart,onstart,onresume
场景三
启动一个activityA 在A上启动一个不透明的activityB
A:oncreate ,A:onstart,A:onresume,A:onpause,B:oncreate ,B:onstart,B:onresume,A:onstop
场景四
启动一个activityA 在A上启动一个不透明的activityB
A:oncreate ,A:onstart,A:onresume,A:onpause,B:oncreate ,B:onstart,B:onresume