Android开发第2-2课:暂停和恢复一个Activity

本课程将会教你

  1. 暂停你的Activity
  2. 回复你的Activity

你应该还读了

  • Activities

尝试它

下载演示模版(未能下载)

ActivityLifecycle.zip


在普通的app使用过程中,前台的 activity有时候会被其他的可视组件阻碍从而导致activity暂停。例如,当打开一个半透明的 activity (例如对话框),前一个activity就会暂停。 只要activity还可见,但是当前activity并不再焦点中,它就保持暂停。

然而,一旦activity被完全的阻碍并且不可视,他就停止了 (在下一课中将会对此进行讨论)。

当你的activity进入暂停状态,系统将会在你的Activity中调用onPause() 函数,它使得你可以停止正在运行的动作,这些动作在paused就应该结束(例如视频) 或者保留任何应该永久保存的信息以防用户推出你的app。 如果用户从paused状态中返回你的activity,系统通过调用onResume()来使其恢复。

注意: 当你的activity接到onPause()的调用,这可能意味着你的activity暂时被暂停,但是用户稍后会返回。然而,更多情况下,意味着用户将要离开你的activity。

Android开发第2-2课:暂停和恢复一个Activity_第1张图片

Figure 1. 当一个半透明activity遮掩了你的activity,系统将调用onPause() 并且activity在Paused状态中等待。如果用户在暂停状态中返回activity系统将会调用onResume()。

暂停你的Activity

当系统为你的activity调用onPause() 时, 从技术上说,这意味着你的activity还部分可视,但更多是意味着用户将要离开这个activity并且很快就进入Stopped状态。你应该使用onPause()来:

  • 停止活跃或者其它正在运行的会消耗CPU的动作。
  • 提交未保存的变化,但只有用户希望保存变化的时候才会这么做(例如email草稿)。
  • 释放系统资源,例如广播接收器,她控制着传感器 (像GPS),或者在app运行的时候,用户并没有用到的任何其他会影响到电池寿命的资源。

例如,如果你的应用使用了摄像头,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()中将变化数据保存到永久存储器 (例如邮件草稿)。然而,应该避免在onPause()中执行需要耗CPU较重的操作,例如写数据到数据库,因为他将会导致转移到下一个 activity的速度变慢 (你应该在onStop()中执行重载的关闭操作)。

你应该使得onPause() 中的操作尽量简单,这使得当你的activity真的要停止时,可以快速跳转到用户的下一个目标。

注意: 当你的activity暂停了,Activity 实例还保留子在内存中,当恢复activity的时候将会被再次调用。你不应该重新初始化任何回调中创建的activity组件使其恢复到Resumed恢复状态。

恢复你的Activity

等用户从Paused状态恢复到你的activity时,系统将会调用onResume() 函数。

要注意的的是,每次你的activity进去前台系统调都会用这个函数,包括第一次创建的时候。例如,你应该实现onResume() 来初始化你在onPause()中释放的组件,并且执行每当activity进入Resumed状态时都必须执行的操作(例如启动一个动画并且在activity获得焦点都的时候初始化要用到的组件)。

下面的onResume()例子是对应于上面onPause()例子的副本,所以他将初始化在暂停中释放的摄像头。

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

你可能感兴趣的:(eclipse,android)