在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停。比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停。只要activity仍然部分可见但是没有获得焦点,它会保持在paused状态。
但是,一旦一个activity完全被阻塞并且不可见,它就会到Stopped状态(后面会讨论这个)。
当activity进入Paused状态,系统会调用activity的onPause()方法,可以让你停止那些不需要继续运行的动作(比如视频)和保存那些需要永久保存的信息来防止用户后面离开的app造成信息丢失。如果用户从Paused状态返回到activity,系统会调用onResume()方法
注意:当activity收到onPause()调用,有可能是表示activity会被暂停一会儿,用户一会儿会回来。但是,通常情况下是用户将要离开activity。
图1.当一个半透明的activity挡住了你的activity,系统会调用onPause()然后这个activity会在Paused状态等待。如果当它还是Paused状态时用户返回了,系统会调用onResume()。
暂停Activity
当系统调用onPause(),技术上说activity仍然部分可见,但是大多数情况下意味着用户很快就会离开activity并且activity很快就会进入Stopped状态。通常情况下你可以用onPause()方法来做下面的事:
停止动画和正在执行的操作,他们会消耗CPU
保存没有保存的东西。但是只是在用户希望他们被永久保存的情况下(比如邮件的草稿)
释放系统资源,比如接收广播信息,处理传感器(比如GPS),或者任何activity暂停后用户不需要但是会消耗电池的资源。
例如,如果你的程序使用照相机,onPause()方法是一个释放它的好地方。
@Override
public void onPause() {
super.onPause(); // Always call the superclass method first
// 在paused状态时,释放照相机资源因为我们不需要它了
// 以及其他我们不需要的资源
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}
通常情况下,不应该用onPause()来存储用户更新(比如表单中的用户信息)到永久的存储。只有你确定用户希望更新被自动保存(比如邮件草稿)的时候,才能保存到永久存储。但是需要避免CPU在onPause()时进行大量的工作,比如存数据库,因为会导致切换到下一个activity变慢(应该把需要大量操作的事情放到onStop())。
你应该控制相对少的操作在onPause()中完成,这样可以让用户迅速切换到下一个activity。实际上你的activity变成Stopped状态了。
注意:当activity在Paused状态时,activity实例仍然在内存中然后activity恢复时被继续调用。在恢复到Resumed状态时不需要在任何回调方法中重新初始化组件。
恢复Activity
当用户从Paused状态恢复activity时,系统会调用onResume()方法。
activity到达前台时,系统每次都会调用这个方法,包括第一次创建。因此,你需要初在onResume()中始化那些在onPause()中释放的组件以及那些每次进入Resumed状态都需要的初始化(比如开始动画以及那些只有在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
}
}