Android开发Activity的生命周期详解
作者:程序遇上智能星空
前言
Android生命周期分为两部分:
- (1)典型情况下的生命周期。
- (2)异常情况下的生命周期。
典型情况下的生命周期分析
图1 Activity的生命周期图解
图2 Activity生命周期的金字塔图
(1)典型情况下的生命周期指在有用户参与的情况下,Activity所经过的生命周期的改变,正常情况下,Activity的常用生命周期有以下几种情况:
- onCreate():Activity启动后第一个被调用的函数,常用来进行Activity的初始化,如创建View,绑定数据和恢复数据。
- onStart():当Activity显示在屏幕上时,函数被调用。
- onRestart():Activity从停止状态进入活动状态是调用。
- onResume():Activity可以接受用户输入时,该函数被调用,此时的activity位于activity栈的栈顶。
- onPause():当Activity进入暂停状态时,该函数被调用,一般用来保存持久的数据或释放占用的资源。
- onStop():当Activity变为不可见后,该函数被调用,Activity进入停止状态。
- onDestroy():在Activity被终止前,被调用。
/*1.onCreate: 每个Activity在写代码的过程中都会看见这个函数, 是声明周期的第一个方法。 一般做一些资源和数据初始化的工作, 比如绑定相对应的资源布局setContentView*/ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } /*2.onRestart: 字面意思表示Activity重新启动,这个状态一般由用户切换应用的行为产生, 比如从应用切换到桌面或者切打开新的Activity, 此时这个Activity就会调用onPause和onStop让这个Activity进入展厅状态。 再回到这个Activity就是onRestart了*/ @Override protected void onRestart() { super.onRestart(); } /*3.onStart: 这个状态我理解就是Activity启动中的一个过程, 就是启动中,但是还不能与用户交互(用户不可见), 属于一个在后台的状态*/ @Override protected void onStart() { super.onStart(); } /*4.onResume: 表示Activity已经可见,且已经开始活动。 与onStart类似的状态但是就是属于一种在前台的状态*/ @Override protected void onResume() { super.onResume(); } /*5.onPause: 是一个非常微妙的状态,处于正在停止的一个临界点, 就很难重现这种状态,就是在停止过程中, 先执行onPause然后在onStop执行之前, 回到Activity执行onResume,这期间就是onPause的状态。 此处可以做一些存储数据停止动画的工作,但是不能太耗时, 不然会影响到新Activity的显示,只有这些操作做完, 新Activity的OnResume才会执行。*/ @Override protected void onPause() { super.onPause(); } /*6.onStop: 表示Activity即将停止,可以做一些相对重量级的回收工作, 同样不能太耗时。*/ @Override protected void onStop() { super.onStop(); } /*onDestroy 表示Activity即将被销毁,这是Activity生命的尽头, 可以做一些回收工作和资源的释放。*/ @Override protected void onDestroy() { super.onDestroy(); }
(2)进一步地,可以将Activity分为3种生存期:
- 完整生存期:在 onCreate() 和 onDestroy() 之间所经历的。
- 可见生存期:在 onStart() 和 onStop() 之间所经历的。
- 前台生存期:在 onResume() 和 onPause() 之间所经历的。
(3)Activity的活动状态:
- 运行状态:位于返回栈栈顶的活动。
- 暂停状态:不在栈顶位置,但仍然可见。
- 停止状态:不在栈顶位置,完全不可见。可能会被系统回收。
- 销毁状态:在返回栈中移除的活动。
(返回栈:每启动一个新的活动,会在返回栈中入栈,并处于栈顶的位置。每销毁一个活动,处于栈顶的活动会出栈,前一个入栈的活动会重新处于栈顶的位置。)
异常情况下的生命周期分析 (1)系统配置发生改变引起生命周期的异常变化
举例:开启手机的自动旋转后,当Activity从竖屏状态转变为横屏时,系统会自动销毁原先的Activity并重建。如果不做特殊处理,那么每当系统配置改变时,Activity都会销毁重建,
如图所示:
图3 旋转手机时Activity的生命周期变化情况
当手机从竖屏转变为横屏时,可以看到原Activity执行: onPause -> onSaveInstanceState -> onStop -> onDestroy ,走完原Activity的生命周期。当原Activity销毁后又会迅速的开启新的Activity执行 :onCreate -> onStart -> onRestoreInstanceState -> onResume, 最终新的Activity显示在用户界面上。onSaveInstanceState 和 onRestoreInstanceState 两个方法仅在生命周期异常情况下执行。onSaveInstanceState主要是对异常销毁的Activity进行数据保存,onRestoreInstanceState主要是对存储的数据进行恢复,数据存取都是通过Bundle,因此我们可以在Bundle中附加个人数据进行读写。经过测试onSaveInstanceState在onStop前调用,onRestoreInstanceState在onStart方法后调用。这两个方法执行的过程中,系统会自动对视图进行信息数据的存取,例如:ListView的滚动位置等等。(2)资源内存不足导致低优先级的Activity被杀死
当系统资源不足时,系统会按照上述优先级去杀死目标的 Activity 所在的进程,并在后续通过 onSaveInstanceState 和 onRestoreInstanceState 来存储和恢复数据。如果一些后台的进程脱离了四大组件而独立运行,那么这个进程很快就被杀死。我们常常将后台工作放到 Service 中保持进程具有一定的优先级。
图4 configChanges添加orientation后的效果
当系统配置改变时Activity会销毁重建,通过在AndroidMainManifest.xml中为Activity添加configChanges属性去避免这个情况。configChanges的属性有很多,例如:orientation表示屏幕方向变化、KeyboardHidden表示虚拟键盘可访问性变化等,通过设置这些属性后当运行过程中发生上述情况Activity既不会销毁重建也不会调用 onSaveInstanceState 和 onRestoreInstanceState 两个方法,而是执行onConfigChanged方法。
问题: (1)onStart 和 onResume、onPause 和 onStop 从功能描述上看大同小异,到底有什么区别呢?
这两组方法对的回调意义不同,onState 和onStop 是从 Activity 是否可见这个角度来回调的,而 onResume 和 onPause 是从 Activity 是否位于前台这个角度来回调的,不过在实际使用中没有其他明显区别。
(2)假设当前Activity为A,如果这时用户打开了一个新的Activity B,那么B的onResume方法和A的onPause方法谁先执行呢?
根据Android的基本运行机制,不能在onPause中执行重量级的操作,因为必须onPause执行完成以后新Activity才能onResume。onPause和onResume都不能执行耗时的操作,尤其是onPause,这就意味着我们应该在onStop中操作,从而使新的Activity显示出来并切换到前台。
到此这篇关于Android开发Activity的生命周期详解的文章就介绍到这了,更多相关Android Activity 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!