Activity生命周期

从图中可以得知Activity的生命周期有一下几种状态
onCreate
onStart
onResume
onPause
onStop
onRestart
onDestory
那到底这几种状态是怎么跑起来的呢?我们来写一个项目试试看
先在第一个Activity写上
![]()
![]()
第二个Activity亦是如此
![]()
好了我们来看看当我们启动Activity的时候,它会怎么运作
从图片可以看出Activity会跑onCreate–>onStart–>onResume
也就是说当Activity跑到onResume的时候就是它正常的运作形态,
那么onCreate和onStart是干嘛的呢?
其实onCreate就是用来构建视图的,构建我们见到的界面
当onCreate跑完的时候,其实整个视图还是不可见的,当我们跑到onStart的时候视图才是可见的
跑到onStart,视图可见,但是不能交互,也就是说你的那些点击事件还是无效的
当跑到onResume的时候,整个Activity运作正常
那么当Activity跳转到别的Activity的时候,有会有什么变化呢?我们来看图
从图片可以看出第一个Activity首先进入了onPause
然后第二个Activity跑了一次onCreate–>onStart–>onResume
再然后第一个Activity进入了onStop
当我们从第二Activity重新回到第一个Activity的时候,它又会怎么跑呢?我们再来看图
可以看出第二Activity进入了onPause
然后第一个Activity跑了onRestart–>onStart–>onPause
紧接着第二个Activity销毁了自己onStop–>onDestory
或许大家还会有些疑问
如果所有的初始化都在onCreate()中实现,会有什么问题?
首先,Activity的onCreate()被调用时,Activity还不可见,如果要做一些动画,既然视图还不存在,在onCreate中来启动动画,明显有问题;
其次,AActivity 切换到 BActivity,再切换到 AActivity(我们假定是AActivity的同一个实例),由于实例已经存在,所以onCreate>不会再被调用,那AActivity从后台切换至前台时,有可能需要一些初始化,那就没法再被调用到了,也有问题;
如果所有的初始化都在onStart()中实现,会有什么问题?
首先,onCreate()注释中,是明确建议 setContentView()、findViewById() 要在 onCreate() 中被调用,但我实测了一下,在onStart()中调用 setContentView()、findViewById() 功能也是正常的;
其次,onStart() 被调用时,Activity可能是可见了,但还不是可交互的,onResume()的注释中都明确地说了这不是Activity对用户是可见的最好的指示器,onStart() 在这之前被调用,那有一些特殊的初始化相关的逻辑在这里被调用也会有问题。
但是不代表建议把所有的初始化工作交给onStart,因为如果这样做,将意味着你每次从别的Activity进来都要初始化一次,相对来说会浪费资源,还是建议把初始化放到onCreate
如果把所有的去初始化都在onStop()中实现,会有什么问题?
1、 在 onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),所以所有的去初始化操作放在onStop()中执行,可能会引出新的问题;
2、onStop() 的注释中明确地写了,在内存不足而导致系统无法保留此进程的情况下,onStop() 可能都不会被执行。
我的老Android手机的相机应用如果未正常关闭,相机在不重启系统的情况下就无法再正常启动,估计就和这个机制有关;相机进程是被强制杀掉的,而导致去初始化操作未被正常执行。
Activity间跳转时,为什么是先AActivity的onPause()被调用,然后是BActivity的初始化流程(onCreate() –> onStart() –> onResume()),再然后是AActivity的onStop()被调用?
1、在 onResume() 的注释中,建议是在onResume()中打开独占设备(比如相机),与onResume()对应的是onPause(),关闭相机的操作也应该在此方法中被调用;否则,考虑一下如下场景:
如果AActivity打开了相机,我们点击某按钮要跳转到BActivity中,BActivity也想打开相机;假设AActivity的onPause() 在 BActivity启动后再被调用,
那BActivity根本就无法再正常启动相机。
2、onPause() 的注释中,也明确地说了,在这个方法中执行停止动画等比较耗CPU的操作,如果不先执行这些操作,就先启动新应用,然后再来执行此操作,确实是不合逻辑;