[安卓教程翻译]4.2 Pausing and Resuming an Activity

通常的app使用中,前台的activity有时会被其他可视化组件阻挡而导致该activity进入pause状态。例如,当一个半透明的activity被打开(就像对话框的形式),先前的activity就暂停了。只要activity仍然部分可见,但是并没有获得焦点,就是paused状态。

 

然而,一旦activity被完全遮挡,变得不可见,就是stoped状态(下节讨论)。

 

一旦activity进入paused状态,系统将调用onPause()方法,该方法会停止不应该继续的操作(如视频),或者保留一些应当被永久保存的信息以防用户退出你的app。如果用户从paused状态返回你的activity,系统将会继续运行它并且调用onResume()方法。

 

注意:当你的activity调用onPause(),它可能表示该activity将暂停片刻,然后重获焦点。不过,大多数情况下,它表示用户马上要关闭你的activity了。

 

暂停Activity

 

当系统调用onPause(),严格意义上来说意味着你的activity仍然部分可见,但通常这是用户即将离开你的activity并且该activity马上要进入Stopped状态。所以,你的onPause()通常应该:

  停止动画或者其他正在进行的,可能占用CPU的操作。

  提交未保存的变化,当然,这是在用户期望你这么做的情况下(比如保存邮件草稿)。

  释放系统资源,比如广播接收器,传感器(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()中将用户的修改(例如填入表格的个人信息)变为永久存储。只有在你确定用户希望这些修改被自动保存(例如修改邮件)才这么做。不过,应当尽量避免在onPause()方法中执行占CPU的操作(例如写入数据库),因为那将延缓向下一个activity的跳转(你应该把那些高负载的关闭操作放在onStop()中)。

 

你应该尽量避免在onPause()中完成较多操作,这样能让你的用户迅速到达下一个目的地。

 

Resume Your Activity

 

当用户从Paused状态恢复你的activity,系统调用onResume()方法。

 

你应该清楚,每次activity进入前台事系统都会调用该方法,包括它第一次被创建的时候。所以,你应该实现onResume()方法来初始化那些在onPause()方法中被释放掉的部分,并执行一些其他每次activity进入Resemed状态时所需要的初始化工作。(比如开始播放动画,或者当activity获得焦点时的特效等)。

 

下面的例子与上面介绍onPause()时的例子相对应,它初始化了在paused状态时被释放的camera。

@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
    }
}

 

posted @ 2014-03-06 16:15  沙发土豆  阅读(144)  评论(0)    收藏  举报