现在的位置: 首页 > 综合 > 正文

Android培训—暂停和恢复Activity

2013年08月26日 ⁄ 综合 ⁄ 共 2136字 ⁄ 字号 评论关闭

本文译自:http://developer.android.com/training/basics/activity-lifecycle/pausing.html#Pause

通常在使用应用程序期间,前台的Activity有些时候会占据其他可视组件的显示位置,从而导致被遮挡的Activity暂停。例如,当一个半透明的Activity打开时(如一个对话框),前一个Activity就会被暂停。尽管该Activity依然部分可见,但当前的焦点并不在该Activity中,所以它依然被暂停(Paused状态)。

但是,一旦该Activity被完全遮挡并不可见,它就会被终止(stopped状态)。

当你的Activity进入Paused状态时,系统会调用该Activity的onPause()方法,在这个方法的实现中,你可以终止暂停Activity的操作或保留某些应该持久保持的信息。如果用户从Paused状态返回到你的Activity时,系统就恢复它,并调用onResume()方法。

注意:当你的Activity接收到一个对onPause()方法的调用,这说明该Activity将会被暂停一会儿,并且用户可能还会返回到这个Activity。但是,通常它首先指明了用户正准备离开这个Activity。

图1.当一个半透明的Activity遮挡了你的Activity时,系统会调用被遮挡Activity的onPause()方法,并且该Activity会等待在Paused状态(1)中。如果用户返回到这个被暂停的Activity时,系统会调用onResume()(2)方法。

暂停Activity

当系统调用你的Activity的onPause()方法时,在技术上意味着你的Activity依然是部分可见的,但是大多数情况是说明用户正在离开这个Activity,并且不久它会进入Stopped状态。通常在以下情况中要使用onPause()回调方法:

1. 终止动画或取消其他消耗CPU的执行操作;

2. 提交未保存的变化,但是只有在用户离开Activity时,期望持久化保存这样的变化时(如电子邮件的草稿等)

3. 释放系统资源,如果广播接收器、处理传感器(如GPS),或任何在你的Activity被暂停时还可能消耗电池,但用户已经不再需要的资源。

例如,如果你的应用程序使用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()方法内持久化的保存用户的变化。但是,在执行onPause()方法期间,你应该避免执行占用CPU的工作,如写入数据的操作,因为这样会减慢下一个Activity的显示时速度(相反,你应该在执行onStop()方法期间执行重负载的操作)。

实际上,如果你的Activity被终止,你应该尽量在你onPause()方法中执行相对简单的操作,以便用户能够快速的转换到下一个目标。

注意:当你的Activity被暂停时,该Activity的实例会被保留在内存中,并且在Activity被恢复时再次调用它。这样就会让该Activity返回到Resumed状态期间,不需要重新初始化那些已经被创建过的组件。

重启Activity

当你的Activity从Paused状态返回Resumed状态时,系统就会调用onResume()方法。

注意系统每次调用这个方法时,你的Activity就会进入前台,包括它第一次被创建时。如你应该实现onResume()方法来初始化那些在执行onPause()方法期间被释放的释放的组件,以及每次在进入Resumed状态时都有发生的初始化操作(如启动动画、只有在Activity获得用户焦点时才初始化的组件)。

下面的onResume()方法会对应上面的onPause()示例,因此它会初始化在Activity被暂停时所释放的Camera对象。

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

 

抱歉!评论已关闭.