Android Activity
程序遇上智能星空 人气:0前言
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显示出来并切换到前台。
加载全部内容