一. 首先,贴出官方给出的activity生命周期图。
二. 各个生命周期介绍:
1. onCreate()
正常启动执行。为展示界面做的准备工作。所以一般设置布局,获取数据都在这个方法里调用。
当某个activity启动了其他activity,这时由于内存不够,系统把上个activity给回收了,这时返回上个activity,会重新执行该方法。这时候可能需要取出一些初始值。
2. onRestart()
正常启动不执行。但某个activity执行onStop方法后,下次显示的时候就会执行该方法。
3. onStart()
正常启动执行。一般少用该生命周期执行任务。
4. onResume()
正常启动执行。在每次页面显示到最上层时都会执行。
官方建议在该声明周期,尽量少做耗时操作。个人建议,除非必须在该生命周期控制,否则不写任何逻辑,具体原因,下面分析。
5. onPause()
页面被覆盖或消失时执行。当从该activity跳转到其他activity时(或者按下home键,或者在该activity弹出里的弹框),会执行该生命周期。
6. onStop()
页面被覆盖或消失时执行。紧跟onPause()之后执行,但是在该activity里弹出一个弹框不会执行,获取启动的activity是透明主题,也不会执行该方法。
7. onDestroy()
页面被销毁时执行。例如按返回键。
三. activity A启动activity B,这两个activity的生命周期执行过程。
1. 首先打开activity A:activity A执行:
onCreate();
onStart();
onResume();
2. 这时候,从activity A跳转打开activity B。
activity A执行:
onPause();
B执行:
onCreate();
onStart();
onResume();
最后A执行:
onStop();
3. 这时候点击返回键,返回activity A。
B执行:
onPause();
A执行:
onRestart();
onStart();
onResume();
最后B执行:
onStop();
onDestroy();
4. 总结:
从A打开B,不是A结束后才打开B,而是B打开以后才结束A。
从B返回A,不是B结束后才返回A,而是返回A以后才结束B。
这个过程很重要,在实际开发中,有时要在全局记录activity栈,这时候对栈里面保存的activity操作的时候就要注意他是否已经存在,他是否已经移除。
5.相关知识:
从activityA打开activityB,是A先pause,然后B执行onCrate,onStart,onResume,最后A才onStop。
这个启动顺序是Android系统开启activity的机制造成的。Android系统管理activity的服务是:ActivityManagerService(简称AMS),这个服务会维护一个activity栈里所有activity的状态同步(也就是统一管理这些activity的生命周期)。看系统源码可以发现,该服务是把栈顶的activity暂停之后,才会开启下一个要显示的activity。
所以建议在onPause方法里尽量不要写逻辑代码,这样有利于下个activity更快的显示出来。