前言:本文主要介绍Activity相关的一些内容。Activity作为四大组件之首,是使用最为频繁的一种组件。正常情况下,除了UWindow、Dialog 和 Toast,我们能见到的界面的确只有Activit。Activity是如此重要。
1 .1Activity的生命周期全面分析
本节将Activity的生命周期分为两部分内容,一部分是典型情况下的生命周期,另一部分是异常情况下的生命周期。
所谓典型情况下的生命周期,是指在有用户参与的情况下,Activity 所经过的生命周期的改变;
而异常情况下的生命周期,是指 Activity 被系统回收 或者 由于当前设备的 Configuration 发生改变从而导致 Activity 被销毁重建,异常情况下的生命周期的关注点和典型情况下略有不同。
1.1.1 典型情况下的生命周期分析
在正常情况下,Activity会经历如下生命周期。
- onCreate:表示 Activity 正在被创建,这是生命周期的第一个方法。在这个方法中, 我们可以做一些初始化工作,比如调用setContentView 去加载界面布局资源、初始化Activity 所需数据等。
- onRestart:表示 Activity 正在重新启动。一般情况下,当当前 Activity 从不可见重新变为可见状态时,onRestart 就会被调用。这种情形一般是用户行为所导致的,比如用户按 Home 键切换到桌面或者用户打开了一个新的 Activity,这是当前的 Activity 就会暂停,也就是 onPause 和 onStop 被执行了,接着用户又回到了这个 Activity,就会出现这种情况。
- onStart:表示 Activity 正在被启动,即将开始,这时 Activity 已经可见了,但是还没有出现在前台,还无法和用户交互。这个时候其实可以理解为 Activity 已经显示出来了,但是我们还看不到。
- onResume:表示 Activity已经可见了,并且出现在前台并开始活动。要注意这个和 onStart 的对比,onStart 和 onResume 都表示Activity已经可见,但是 onStart 的时候 Activity 还在后台,onResume 的时候 Activity 才显示到前台。
- onPause:表示 Activity 正在停止,正常情况下,紧接着 onStop 就会被调用。在特殊情况下,如果这个时候快速地再回到当前 Activity,那么 onResume 会被调用。笔者的理解是,这种情况属于极端情况,用户操作很难重现这一场景。此时可以做一些存储数据、 停止动画等工作,但是注意不能太耗时,因为这会影响到新 Activity 的显示,onPause 必须先执行完,新 Activity的 onResume 才会执行。
- onStop:表示 Activity 即将停止,可以做一些稍微重量级的回收工作,同样不能太耗时。
- onDestroy:表示 Activity 即将被销毁,这是 Activity 生命周期中的最后一个回调, 在这里,我们可以做一些回收工作和最终的资源释放。
正常情况下,Activity的常用生命周期就只有上面 7 个,图1-1,1-2会更详细地描述了 Activity 各种生命周期的切换过程。
图1-1
图1-2
二、异常情况下生命周期
所谓的异常情况,通常指的是手机配置改变和因内存不足导致被系统回收。
- onSaveInstanceState 方法会在按Home键或者启动新 Activity 以及 Activity 被异常终止时触发调用。 Activity 被异常终止的情况下,它的调用时机是在 onStop 之前,它和 onPause 方法没有既定的时序关系。当 Activity 被重新创建的时候,onRestoreInstanceState 会被回调,它的调用时机是 onStart 之后。非异常终止时,不调用 onRestoreInstanceState。
“系统只会在 Activity 即将被销毁并且有机会重新显示的情况下才会去调用 onSaveInstanceState 方法。” - 调用 onSaveInstanceState 与 onRestoreInstanceState 来储存和恢复的数据,比如文本框中用户输入的数据、listview 滚动的位置等,这些 view 相关的状态系统都会默认为我们恢复。具体针对某一个 view 系统能为我们恢复哪些数据可以查看 view 的源码中的 onSaveInstanceState 和 onRestoreInstanceState 方法。
- android:configChanges=”xxx”属性,常用的主要有下面三个选项:local: 设备的本地位置发生了变化,一般指切换了系统语言;keyboardHidden: 键盘的可访问性发生了变化,比如用户调出了键盘;orientation: 屏幕方向发生了变化,比如旋转了手机屏幕。配置了 android:configChanges=”xxx”属性之后,Activity就不会在对应变化发生时重新创建,而是调用 Activity 的 onConfigurationChanged 方法。
- Activity 优先级(不易被回收程度):前台 Activity > 可见但非前台 Activity > 后台 Activity。