在正常使用应用的过程中,前台的activity在一些时候会被其他的组件遮挡,导致这个activity暂停。举个例子,当一个半透明的 activity被打开(例如一个dialog样式的activity),它之前的activity就会暂停。如果这个activity长时间一直只能部 分可见并且获取不到当前的焦点,它就保持暂停状态。
然而,一旦这个activity被完全遮挡并且完全不可见,它就会停止(我们会在下此课程中讨论)。
当你的应用进入到暂停状态,系统会调用你的activity的onPause() 方法,它允许你停下正在进行的操作,这些操作不能再暂停状态继续(例如播放一个视频),你还可以存储一些当用户回到应用后需要持久化的信息。如果用户回到你的应用,系统会恢复它,并且调用onResume()方法。
提示: 当你的应用接收到onPause()的调用时,它可能就表示这个activity将要暂停一会儿,用户可能会再次回到这个activity。然而,它通常表示用户离开你的应用的第一步。
图1. 当一个半透明的activity挡住你的activity,系统会调用onPause() 方法,同时这个activity将会在Paused 状态下等待。如果当用户回到这个activity,它仍处于暂停状态,那么系统会调用onResume() 方法。.
暂停你的Activity
当系统调用你的activity的onPause() 方法时,从技术上来讲你的activity仍然部分可见,但是这通常表示用户正在离开你的activity,同时它马上要进入Stopped状态。你通常应该使用onPause() 回调来:
停止可能会消耗CPU资源的动画或者任何正在进行中的操作。
提交为保存的改变,前提是当用户离开这个activity时期望这些改变被保存(例如一个邮件草稿)。
释放系统资源,例如广播接收者,传感器(像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方法中持久化用户改变至永久存储上的情况是你很确定用户 期望改变会被自动保存(例如当起草一个email)。然而,你应该避免在onPause()状态下执行CPU密集型操作。例如写数据库,因为它会减慢切换 到下一个activity的速度(作为代替,你应该执行高负载的关闭操作)。
你应该保持这些操作在onPause() 方法中按照相对简单的顺序完成,这样,如果你的应用被停止后能够迅速切换到用户的下一个目的地。
提示: 当你的activity被暂停时,这个Activity 实例被保存在内存中,在activity恢复时会被重新调用。你没有必要在任何回调方法中重新初始化已经创建过的组件来让activity回到Resumed状态。
恢复你的Activity
当用户从Paused状态恢复activity时,系统会调用onResume() 方法。
记住系统在每次activity进入到前台时都会调用这个方法,包括它第一次被创建。这样的话,你就必须在onResume()的实现方法中初始化在 onPause()方法被释放的资源,并且其他的资源只能在activity进入到Resumed状态下才能执行初始化操作。
下面这个onResume() 方法的示例对应着上面的onPause() 方法的示例,因此在onResume()方法中要初始化在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 } }
感觉本站内容不错,读后有收获?小额赞助,鼓励网站分享出更好的教程