暂停和继续(运行)一个Activity
在app的正常使用中,前台的activity有时会被其他可视化组件遮挡而进入暂停 状态。例如,当打开一个半透明的activity(例如一个对话框风格的),之前的activity就会暂停。只要这个activity部分可见,当前未获得用户焦点,它就保持暂停状态。
尽管如此,一旦某个activity完全被遮挡且不可见,它就会处于停止状态(下节课讨论此问题)。
当你的activity进入暂停状态后,系统会调用你的activity的onPause()方法,在这个方法里,你可以停止一些此时不应再进行的动作(例如播放视频)或者保存一些需要永久保存的信息,以防止用户离开你的app导致信息丢失。如果用户返回到你的处于暂停状态的activity,那么系统会继续运行它并且调用onResume()方法。
注意:当你的activity被调用onPause()时,它可能意味着你的activity会暂停一会儿,用户会很快返回到你的activity。尽管如此,它通常表示用户正在离开你的activity。
Figure 1. 当一个半透明的activity遮挡住了你的activity时, 系统会调用 onPause() , activity会停留在暂停(Paused)状态等待(1).当用户返回时,activity正处于暂停状态, 系统会调用 onResume() (2).
暂停你的Activity
当系统调用你的activity的onPause()方法时,从技术上讲,这意味着你的activity处于部分可见,但是通常情况下,表明用户实际上要离开你的activity,很可能接下来你的activity就会进入停止(Stopped)状态。你应该通常使用onPause()做如下事情:
停止动画或者其它消耗CPU的操作。
提交未保存的信息,只有当用户希望离开的时候此信息被永久保存(例如保存邮件草稿)。
释放系统资源,比如一个广播接收者,传感器处理(如GPS),或者其他任何当activity处于暂停状态,而用户不再需要的影响电池寿命的资源。(本人理解,重点是用户不再需要的资源)
例如,如果你的应用使用了Camera,在onPause()里是释放它的最好的地方。
@Override public void onPause() { super.onPause(); //总是首先调用基类方法 //当处于暂停状态释放Camera // 其它Activity可能需要它. if (mCamera != null) { mCamera.release() mCamera = null; } }
通常情况下,你不应该在onPause()方法里将用户的改动(例如用户在表格中输入的个人信息)存储到永久区域里。只有当用户希望他的改动自动保存的时候(例如编辑邮件草稿),你才应该将这些改动永远存储起来。尽管如此,你也应该避免在onPause()里做一些CPU密集型的工作,比如写数据库。因为这样会减缓向下一个Activity的迁移显示的流畅性(你应该在onStop()里做这些操作。)
如果你的activity确实是将要停止,你应该保证在onPause()方法里做相对简单地操作,这样可以使到下一个activity的转换显示保持流畅。
继续(运行)你的Activity
当用户返回到处于暂停状态的activity时,系统会调用它的onResume()方法。
你应该知道当你的activity每一次进入前台时,包括第一次创建,系统都会调用这个方法。正是如此,你应该在onResume()初始化那些在onPause()中释放的组件,执行其他一些当进入运行状态时必须进行的初始化操作(例如开始动画和初始化一些当activity获得用户焦点时才使用的组件。)
下面的onResume()例子,正好与上面的onPause()相反。它初始化在activity处于暂停状态时释放的camera。
@Override public void onResume() { super.onResume(); //总是首先调用基类方法 // 每当activity获得用户焦点,获得camera实例 if (mCamera == null) { initializeCamera(); // 调用局部方法初始化camera } }