先放上Android API官方图镇楼。
oncreate()->onstart()->onResume()->onRestart()->onPouse()->onStop()->onDestory()
Activity的四种状态
1 运行状态
当一个 Activity 处于前台时,即处于栈顶时,它是活动或者运行的状态。
2 暂停状态
当一个 Activity 失去焦点但仍然可见时,该 Activity 处于暂停状态(例如,在一个 Activity 上弹出一个对话框,该对话框并不铺满屏幕,原先的 Activity仍然被用户能看到)。一个处于暂停状态的 Activity 仍然是完全存活的(它会保存之前的状态和成员变量),但在内存极低的情况下会被系统杀死。
3 停止状态
但一个 Activity 完全被另一个 Activity 隐藏时,该 Activity 处于停止状态(即该 Activity 不再处于栈顶,并且不对用户来说可见时)。处于停止状态的 Activity 会保存之前的状态和成员变量,但在系统内存不够时,有可能被系统杀死(这种概率比处于暂停状态的 Activity 高)。
4 销毁状态
当一个 Activity 被移出返回栈时,它就处于销毁状态。处于销毁状态的 Activity 最有可能被系统回收。
Activity的七个回调方法
1 onCreate:create表示创建,这是Activity生命周期的第一个方法,也是我们在android开发中接触的最多的生命周期方法。它本身的作用是进行Activity的一些初始化工作,比如使用setContentView加载布局,对一些控件和变量进行初始化等。但也有很多人将很多与初始化无关的代码放在这,其实这是不规范的。此时Activity还在后台,不可见。所以动画不应该在这里初始化,因为看不到……
2 onStart:start表示启动,这是Activity生命周期的第二个方法。此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。其实将Activity的初始化工作放在这也没有什么问题,放在onCreate中是由于官方推荐的以及我们开发的习惯。
3 onResume:resume表示继续、重新开始,这名字和它的职责也相同。此时Activity经过前两个阶段的初始化已经蓄势待发。Activity在这个阶段已经出现在前台并且可见了。这个阶段可以打开独占设备
4 onPause:pause表示暂停,当Activity要跳到另一个Activity或应用正常退出时都会执行这个方法。此时Activity在前台并可见,我们可以进行一些轻量级的存储数据和去初始化的工作,不能太耗时,因为在跳转Activity时只有当一个Activity执行完了onPause方法后另一个Activity才会启动,而且android中指定如果onPause在500ms即0.5秒内没有执行完毕的话就会强制关闭Activity。从生命周期图中发现可以在这快速重启,但这种情况其实很罕见,比如用户切到下一个Activity的途中按back键快速得切回来。
5 onStop:stop表示停止,此时Activity已经不可见了,但是Activity对象还在内存中,没有被销毁。这个阶段的主要工作也是做一些资源的回收工作。
6 onDestroy:destroy表示毁灭,这个阶段Activity被销毁,不可见,我们可以将还没释放的资源释放,以及进行一些回收工作。
7 onRestart:restart表示重新开始,Activity在这时可见,当用户按Home键切换到桌面后又切回来或者从后一个Activity切回前一个Activity就会触发这个方法。这里一般不做什么操作。
Activity的三个生存周期
activity的三个生存周期,我们从上图也可以看的出来,主要介绍一下调用时间段。
完整生存期
Activity 的完整生存期是指在 onCreate()
方法第一次被调用和 onDestroy()
方法最后一次被调用之间的时间段;
应当在 onCreate()
方法内完成初始化操作, 并在 onDestroy()
方法内释放内存。
可见生存期
Activity 的可见生存期是指在 onStart()
方法被调用和 onStop()
方法被调用之间的时间段;
在可见生存期内,Activity 是可见的,即使该 Activity 不再前台和无法与用户交互;
在 Activity 的整个生命周期,当 Activity 在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用 onStart()
方法和 onStop()
方法。
前台生存期
Activity 的前台生存期是指在 onResume()
方法被调用和 onPause()
方法被调用之间的时间段;
在前台生存期内,Activity 处于运行状态,位于屏幕上其他所有 Activity 之上,能与用户进行交互。
在这里重点需要关注的问题应该是Activity切换时的操作顺序。
(A)onPause→(B)onCreate→(B)onStart→(B)onResume→(A)onStop(正解)
(A)onPause→(A)onStop→(B)onCreate→(B)onStart→(B)onResume(错误)
(1)一个Activity或多或少会占有系统资源,而在官方的建议中,onPause方法将会释放掉很多系统资源,为切换Activity提供流畅性的保障,而不需要再等多两个阶段,这样做切换更快。
(2)按照生命周期图的表示,如果用户在切换Activity的过程中再次切回原Activity,是在onPause方法后直接调用onResume方法的,这样比onPause→onStop→onRestart→onStart→onResume要快得多。
举个例子来帮助记忆,当我们编辑完短信内容还没有发送,然后切换到桌面,这时短信内容并没有被销毁。
我们可以借助官方文档的代码,写一个demo帮助记忆。
public class Activity extends ApplicationContext {
protected void onCreate(Bundle savedInstanceState);
protected void onStart();
protected void onRestart();
protected void onResume();
protected void onPause();
protected void onStop();
protected void onDestroy();
}
我们只需重写代码即可,参考log,即可更清楚的了解运行周期。
参考
Android官方文档
《第一行代码》
https://blog.csdn.net/android_tutor/article/details/5772285