3.2 暂停和继续 Activity

在正常使用应用的过程中,应用有时会失去焦点,导致 Activity 暂停。例如,当应用在多窗口模式下运行时,仅有一个应用随时具备焦点;系统将暂停所有其他应用。 例如,当半透明 Activity 打开时(比如对话框样式中的 Activity),上一个 Activity 会暂停。 只要 Activity 仍然部分可见但目前又未处于焦点之中,它会一直暂停。

但是,一旦 Activity 完全被阻挡并且不可见,它便停止(将在下一堂课中讨论)。

当您的 Activity 进入暂停状态时,系统会对您的 Activity 调用 onPause() 方法,通过该方法,您可以停止不应在暂停时继续的进行中操作(比如视频),还可保留在用户继续离开应用时应予永久保存的任何信息。如果用户从暂停状态返回到您的 Activity,系统会重新开始该 Activity 并调用 onResume() 方法。

:当系统调用 Activity 的 onPause() 方法时,系统将发出信号,指出 Activity 将暂时暂停,且用户可能将焦点返回到您的 Activity,或者应用在多窗口模式下运行。 但是,此方法调用通常也是用户即将离开您 Activity 的第一个信号。

图 1. 半透明 Activity 遮盖您的 Activity 时,系统会调用 onPause() 且 Activity 会在“暂停”状态 (1) 下等待。如果用户在 Activity 仍然处于暂停状态时返回 Activity,则系统会调用 onResume() (2)。

暂停 Activity

当系统为您的 Activity 调用 onPause() 时,它从技术角度看意味着您的 Activity 仍然处于部分可见状态,但往往说明用户即将离开 Activity 并且它很快就要进入“停止”状态。 您通常应使用 onPause() 回调:

  • 检查 Activity 是否可见。如果不可见,请停止动画或其他正在进行的可能消耗 CPU 的操作。记住,从 Android 7.0 开始,暂停的应用可能会在多窗口模式下运行。 在本示例中,您可能不想停止动画或视频播放。
  • 提交未保存的更改,但仅当用户离开时希望永久性保存此类更改(比如电子邮件草稿)。
  • 释放系统资源,比如广播接收器、传感器手柄(比如 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() 中永久性存储用户更改。但您应避免在 onPause() 期间执行 CPU 密集型工作,比如向数据库写入信息,因为这会拖慢向下一 Activity 过渡的过程(您应改为在 onStop() 间执行高负载关机操作)。

您应通过相对简单的方式在 onPause() 方法中完成大量操作,这样才能加快在您的 Activity 确实停止的情况下用户向下一个目标过渡的速度。

:当您的 Activity 暂停时,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
    }
}
posted @ 2017-06-15 13:53  YouseiRaws  阅读(383)  评论(0编辑  收藏  举报