暂停和重启一个Activity
在通常的app使用过程中,前台运行的Activity在某些时候会被其它的可视化组件阻塞导致这个Activity暂停。例如,当某个半透明的Activity打开(比如某种对话框),则之前那个Activity就会被暂停。只要这个Activity仍然是部分可见的,但是当前不是获得焦点的,它就一直保持paused状态。
但是,一旦这个Activity完全被阻塞并且不可见,它就停止了(这个将在下一课中讨论)。
当你的Activity进入暂停状态,系统就在你的Activity上调用onStop()方法,这允许你停止一些正在进行的动作,这些动作在暂停的时候不应该继续(例如播放视频)或者持久化任何信息,这些信息在用户继续离开app时应该永久保存的。如果用户在暂停的状态下重新回到你的Activity,系统会重新启动它并调用onResume()方法。
注意:当你的Activity收到一个onPause()调用,这可能表示你的Activity将会暂停一段时间然后用户可能会重新回来关注你的Activity。然而,这通常是第一个指示,用户正在离开你的Activity。
暂停你的Activity
当系统为你的Activity调用onPause()方法时,它技术上的意思是你的Activity仍然是部分可见的,但是它更通常是用户正在离开你的Activity并且马上就要进入停止状态的暗示。你通常应该使用onPause()回调来做如下动作:
- 停止动画或其他正在进行的会消耗CPU的动作
- 提交没有保存的配置,但只是那些用户期望在他们离开时被永久保存的变更(比如电子邮件的草稿)
- 当你的activity被暂停时,释放系统资源,例如广播接收者(broadcast receiver)、传感器的处理(比如GPS),或者其他任何有可能影响电池使用寿命的资源,用户并不需要它们。
例如,你的应用程序使用了摄像头,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
当用户从暂停状态重新启动你的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
}
}