在正常使用应用的过程中。前台的activity在一些时候会被其它的组件遮挡,导致这个activity暂停。举个样例。当一个半透明的activity被打开(比如一个dialog样式的activity),它之前的activity就会暂停。

假设这个activity长时间一直仅仅能部分可见而且获取不到当前的焦点。它就保持暂停状态。

然而,一旦这个activity被全然遮挡而且全然不可见,它就会停止(我们会在下此课程中讨论)。

当你的应用进入到暂停状态,系统会调用你的activity的onPause() 方法,它同意你停下正在进行的操作,这些操作不能再暂停状态继续(比如播放一个视频),你还能够存储一些当用户回到应用后须要持久化的信息。

假设用户回到你的应用。系统会恢复它,而且调用onResume()方法。

提示: 当你的应用接收到onPause()的调用时,它可能就表示这个activity将要暂停一会儿,用户可能会再次回到这个activity。然而。它通常表示用户离开你的应用的第一步。

Android学习路线(十三)Activity生命周期——暂停和恢复(Pausing and Resuming )一个Activity-LMLPHP

图1. 当一个半透明的activity挡住你的activity,系统会调用onPause() 方法。同一时候这个activity将会在Paused
状态下等待。假设当用户回到这个activity,它仍处于暂停状态,那么系统会调用onResume() 方法。.

暂停你的Activity


当系统调用你的activity的onPause() 方法时,从技术上来讲你的activity仍然部分可见,可是这通常表示用户正在离开你的activity,同一时候它立即要进入Stopped状态。

你通常应该使用onPause() 回调来:

  • 停止可能会消耗CPU资源的动画或者不论什么正在进行中的操作。
  • 提交为保存的改变,前提是当用户离开这个activity时期望这些改变被保存(比如一个邮件草稿)。
  • 释放系统资源,比如广播接收者。传感器(像GPS)的处理,或者不论什么将会费电的资源,由于你的activity已经暂停,用户不再须要它们。

比如,假设你的应用使用到CameraonPause() 方法是一个释放它的好地方。

@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方法中持久化用户改变至永久存储上的情况是你非常确定用户期望改变会被自己主动保存(比如当起草一个email)。

然而,你应该避免在onPause()状态下运行CPU密集型操作。比如写数据库。由于它会减慢切换到下一个activity的速度(作为取代。你应该运行高负载的关闭操作)。

你应该保持这些操作在onPause() 方法中依照相对简单的顺序完毕。这样。假设你的应用被停止后可以迅速切换到用户的下一个目的地。

提示: 当你的activity被暂停时,这个Activity 实例被保存在内存中。在activity恢复时会被又一次调用。你没有必要在不论什么回调方法中又一次初始化已经创建过的组件来让activity回到Resumed状态。

恢复你的Activity


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

记住系统在每次activity进入到前台时都会调用这种方法。包含它第一次被创建。

这种话,你就必须在onResume()的实现方法中初始化在onPause()方法被释放的资源,而且其它的资源仅仅能在activity进入到Resumed状态下才干运行初始化操作。

以下这个onResume() 方法的演示样例相应着上面的onPause() 方法的演示样例,因此在onResume()方法中要初始化在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
    }
}
05-11 17:49