翻译自官方文档API 21
暂停和恢复一个activity
在一般的APP使用过程中,前台activity有时候会被其他的可视化组件阻塞,从而造成这个activity暂停。比如,一个半透明的activity启动了(比如对话框),这个activity就会暂停。只要这个activity仍然处于部分可见状态,但是它又不是当前获得焦点的activity,它就一直停在暂停状态。
然而,一旦这个activity被完全阻塞并且处于不可见状态,它就停止了(这会在下一节课讲到)。
当你的activity进入暂停状态时,系统会调用activity中的onPause()方法,这允许你停止一些正在进行的活动或保存一些信息,这些活动在activity处于暂停状态时不应当继续进行(比如说视频),这些信息也应当被保存以防用户离开你的APP。如果用户从暂停状态回到你的activity,系统会恢复这个activity并调用onResume()方法。
Note:当系统调用你的activity的onPause()方法时,这可能预示着这个activity将会被暂停一会儿,过一会用户可能又会回到你的activity。但是,它通常又是用户离开你的activity的第一迹象。
图1 当一个半透明的activity阻塞了你的activity时,系统调用onPause()方法,activity在暂停状态(1)等待。如果用户回到暂停状态的activity,系统调用onResume()方法(2)。
暂停你的activity
当系统调用你的activity的onPause()方法时,专业来讲,它意味着你的你的activity仍然部分可见,但是,它更多时候地意味着用户在离开你的activity并且会很快进入停止状态。你通常应该使用onPause()方法来做以下事情:
- 停止动画或其他消耗系统CPU的活动;
- 提交一些未保存的变化,但是仅当用户期望在他们离开时这些变化会被永久保存(比如邮件草稿);
- 当你的activity处于暂停状态并且用户不再需要这些服务时,释放系统资源,比如广播接收器,传感器的控制权(像GPS),或任何可能影响电池寿命的资源。
比如说,你的应用程序使用摄像头(camera),onPause()方法就是一个释放它的不错地方。
@Override
public void onPause() {
super.onPause(); // Always call the superclass method first
// Release the Camera because we don't need it when paused
// and other activities might need to use it.
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}
通常,你不应当使用onPause()方法来永久性存储用户的变化(changes)(比如填入表格的用户信息)。唯一一种情况下你应当在onPause()方法中永久性存贮用户的变化,是当你十分确定这些变化应当被自动保存(比如说编辑邮件的时候)。但是,你应该避免在onPause()方法中做一些CPU密集型(CPU-intensive)工作,比如向数据库写入数据,因为这会降低可见的activity转换速度(你应当在onPause()方法中替换掉一些重负载的关闭(shutdown)工作)。
如果你的activity实际上正在被停止,那么为了更快地转换到用户的目的activity,你应当让大量的操作尽量相对简单。
Note:当你的activity被暂停时,这个activity实例实际还在内存中,当它恢复时它又会被再次调用。你不必再次初始化任何在恢复状态之前创建的组件。
恢复你的activity
当用户从暂停状态恢复到你的activity时,系统调用onResume()方法。
你必须明白,系统在每次activity到前台的时候调用这个方法,包括它第一次被创建。正是这样,你必须实现onResume()方法,并在其中初始化那些在onPause()方法中被你释放掉的组件,还要做一些恢复状态必须做的初始化工作(比如开始动画,初始化一些只有在获取用户焦点时才能被使用的组件)。
下面的例子是和上面onStop()方法对于的onResume()方法,它初始化了在暂停状态时被释放掉的摄像头。
@Override
public void onResume() {
super.onResume(); // Always call the superclass method first
// Get the Camera instance as the activity achieves full user focus
if (mCamera == null) {
initializeCamera(); // Local method to handle camera init
}
}