在一般的应用软件的使用过程中,在前台运行的Activity有时候会被其他可见部件遮挡,导致Activity切换到pause状态。例如,当打开一个新的半透明Activity时,前一个Activity就会进入pause状态。只要这个Activity呈现半可见状态,没有获得焦点,它就始终处于pause状态。
然而,如果这个Activity被彻底阻挡,它会转入stop状态(下一节中介绍)。
当Activity进入paused状态,系统会调用Activity的OnPause()方法,暂停一些正在进行的动作(如视频)或者保留一些需要永久保存的信息以防用户后续彻底退出应用软件。当用户使Activity从pause状态返回,系统则会调用OnResume()方法。
注意: 当Activity接收到OnPause()的调用,表明该Activity将会暂停运行一段时间,但是用户也有可能重新返回到该Activity。然而,这个事件通常都标志着用户将离开这个Activity。
Activity的暂停
当系统调用一个Activity的OnPause()方法时,从技术上看该Activity仍处于半可见状态,然而大部分情况下都表明着用户将要离开这个Activity,即该Activity即将进入Stopped状态。OnPause()方法经常被用来:
停止动画或者其他消耗CPU的持续运行的动作;
保存用户期望在其离开应用软件后仍然需要保存的修改(如一份邮件草稿);
释放系统资源,如广播接收器,传感器处理句柄以及其他一些用户不再会使用到的影响电池使用时间的资源。
例如,如果一个应用软件使用了摄像头,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()方法中对这些修改进行保存。还有为了让新的Activity的显示更流畅,开发者应该避免在OnPause()方法中执行CPU使用率高的动作,如写数据库——这些动作可以放到OnStop()中实现。
注意:当Activity进入Pause状态,Activity实例仍保留在内存,可以在重新启动时被重新使用。在触发Resumed状态的回调函数中创建的任何部件都不需要重新初始化。
Activity的重新运行
当用户重新运行一个处于Paused状态的Activity,系统调用OnResume()方法。
每次一个Acitivity转到前台运行,包括Acitivity在首次被创建的时候,系统都会调用OnResume()方法。因此,开发者需要在OnResume()方法中实现OnPause()方法中释放的部件的初始化,以及其他一些Activiity进入Resumed状态必须要初始化的部件的初始化,如开始动画和对一些只在Activity获得用户焦点时用到的部件的初始化。
下面例子中的OnResume()方法与前面的OnPause()例子相对应,在这个OnResume()方法中对被释放的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
}
}