[安卓教程翻译]4.2 Pausing and Resuming an Activity
通常的app使用中,前台的activity有时会被其他可视化组件阻挡而导致该activity进入pause状态。例如,当一个半透明的activity被打开(就像对话框的形式),先前的activity就暂停了。只要activity仍然部分可见,但是并没有获得焦点,就是paused状态。
然而,一旦activity被完全遮挡,变得不可见,就是stoped状态(下节讨论)。
一旦activity进入paused状态,系统将调用onPause()方法,该方法会停止不应该继续的操作(如视频),或者保留一些应当被永久保存的信息以防用户退出你的app。如果用户从paused状态返回你的activity,系统将会继续运行它并且调用onResume()方法。
注意:当你的activity调用onPause(),它可能表示该activity将暂停片刻,然后重获焦点。不过,大多数情况下,它表示用户马上要关闭你的activity了。

暂停Activity
当系统调用onPause(),严格意义上来说意味着你的activity仍然部分可见,但通常这是用户即将离开你的activity并且该activity马上要进入Stopped状态。所以,你的onPause()通常应该:
停止动画或者其他正在进行的,可能占用CPU的操作。
提交未保存的变化,当然,这是在用户期望你这么做的情况下(比如保存邮件草稿)。
释放系统资源,比如广播接收器,传感器(GPS),或者其他可能影响电池寿命的资源。
举例来说,如果你的程序用了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()方法中执行占CPU的操作(例如写入数据库),因为那将延缓向下一个activity的跳转(你应该把那些高负载的关闭操作放在onStop()中)。
你应该尽量避免在onPause()中完成较多操作,这样能让你的用户迅速到达下一个目的地。
Resume Your Activity
当用户从Paused状态恢复你的activity,系统调用onResume()方法。
你应该清楚,每次activity进入前台事系统都会调用该方法,包括它第一次被创建的时候。所以,你应该实现onResume()方法来初始化那些在onPause()方法中被释放掉的部分,并执行一些其他每次activity进入Resemed状态时所需要的初始化工作。(比如开始播放动画,或者当activity获得焦点时的特效等)。
下面的例子与上面介绍onPause()时的例子相对应,它初始化了在paused状态时被释放的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 } }

浙公网安备 33010602011771号