注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/basics/activity-lifecycle/pausing.html
在正常使用应用的过程中,在前台的activity有时候会被其它组件所遮挡,导致这个activity进入到暂停态。例如:当打开一个半透明activity(dialog中有这样一种风格),之前的activity会被暂停。只要这个activity仍然保持部分可见,同时当前没有获得用户焦点,它就会保持在暂停态。
然而,当一个activity被完全遮蔽,同时变得不可见,那么它将进入停止态(这块内容将在下一节课展开)。
当你的activity进入暂停态,系统将会对你的activity调用onPause()方法,这使得你可以停止那些在暂停态阶段不能继续进行的操作(比如一个正在播放的视频),或者存储一些信息,以防如果用户退出应用后丢失数据。如果用户从暂停态回到你的activity,系统会调用onResume()方法来恢复它。
Note:
当你的activity执行了onPause()方法,这表明activity可能会临时地暂停一下,用户可能会重新获得activity焦点。然而,它也通常可能意味着用户将要离开你的activity。
图1. 当一个半透明的activity遮挡了你的activity,系统会调用onPause()方法,然后activity在暂停态保持等待(1)。
如果用户回到这个activity时,activity处于暂停态,将会调用onResume()方法(2)。
一). 暂停你的Activity
当系统对你的Activity调用onPause()方法,从技术上说,这表明你的activity处于部分显示的状态,但多数情况这意味着用户将要离开activity,并且activity将要马上进入停止态。你应该经常在以下情况下使用onPause()回调函数:
- 停止那些会消耗CPU资源的动画或其它正在执行的操作
- 提交还未保存的修改(仅当用户希望当他们离开时这些变化会被永久的保存,比如:一个邮件草稿)
- 释放系统资源,比如广播接收器(broadcast receiver),对传感器(如: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()来存储用户的变更(比如在一个表单中填写的个人信息)到ROM中,只有在你确定用户期望这些改变(比如邮件草稿)应该被永久存储时,才应该在onPause()中把它们永久存储起来。然而,你应该避免在onPause()中执行大量消耗CPU资源的事务,比如写入数据库,因为这将会影响到下一个activity变化为可见状态的流畅度。(这些大量消耗资源的事务应该在onStop()方法中执行)
你应该尽量保持在onPause()中执行的操作相对简单,以此使得用户到下一个目的地的切换是流畅的(如果你的activity实际上已经进入了停止态)。
Note:
当你的activity处于暂停态,Activity实例会存储在RAM中,当这个activity恢复时,会重新从存储里调用。在activity切换到恢复态的过程中你不再需要重新初始化任何已经创建过的组件。
二). 恢复你的Activity
当用户将你的activity从暂停态恢复到恢复态时,系统会调用onResume()方法。
注意:每当你的activity来到前台时,系统都会调用这个方法,包括当它第一次被创建时。例如:你应该在onResume()中初始化那些你在onPause()方法中释放的组件,并且完成其他当activity进入恢复态时必须执行的初始化操作。(例如启动一些动画,以及初始化那些只有activity获取了用户焦点时才会被使用的组件)
下面这个onResume()例子对应于上述onPause()的例子,它初始化了当activity进入暂停态时释放的相机:
@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
}
}