Activity的生命周期(二)

来源:互联网 发布:nba2001总决赛数据 编辑:程序博客网 时间:2024/06/15 23:39

翻译自官方文档API 21

暂停和恢复一个activity

  在一般的APP使用过程中,前台activity有时候会被其他的可视化组件阻塞,从而造成这个activity暂停。比如,一个半透明的activity启动了(比如对话框),这个activity就会暂停。只要这个activity仍然处于部分可见状态,但是它又不是当前获得焦点的activity,它就一直停在暂停状态。

  然而,一旦这个activity被完全阻塞并且处于不可见状态,它就停止了(这会在下一节课讲到)。

  当你的activity进入暂停状态时,系统会调用activity中的onPause()方法,这允许你停止一些正在进行的活动或保存一些信息,这些活动在activity处于暂停状态时不应当继续进行(比如说视频),这些信息也应当被保存以防用户离开你的APP。如果用户从暂停状态回到你的activity,系统会恢复这个activity并调用onResume()方法。

Note:当系统调用你的activity的onPause()方法时,这可能预示着这个activity将会被暂停一会儿,过一会用户可能又会回到你的activity。但是,它通常又是用户离开你的activity的第一迹象。


图1 当一个半透明的activity阻塞了你的activity时,系统调用onPause()方法,activity在暂停状态(1)等待。如果用户回到暂停状态的activity,系统调用onResume()方法(2)。

暂停你的activity

  当系统调用你的activity的onPause()方法时,专业来讲,它意味着你的你的activity仍然部分可见,但是,它更多时候地意味着用户在离开你的activity并且会很快进入停止状态。你通常应该使用onPause()方法来做以下事情:

  • 停止动画或其他消耗系统CPU的活动;
  • 提交一些未保存的变化,但是仅当用户期望在他们离开时这些变化会被永久保存(比如邮件草稿);
  • 当你的activity处于暂停状态并且用户不再需要这些服务时,释放系统资源,比如广播接收器,传感器的控制权(像GPS),或任何可能影响电池寿命的资源。

  比如说,你的应用程序使用摄像头(camera),onPause()方法就是一个释放它的不错地方。

@Overridepublic 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()方法来永久性存储用户的变化(changes)(比如填入表格的用户信息)。唯一一种情况下你应当在onPause()方法中永久性存贮用户的变化,是当你十分确定这些变化应当被自动保存(比如说编辑邮件的时候)。但是,你应该避免在onPause()方法中做一些CPU密集型(CPU-intensive)工作,比如向数据库写入数据,因为这会降低可见的activity转换速度(你应当在onPause()方法中替换掉一些重负载的关闭(shutdown)工作)。

  如果你的activity实际上正在被停止,那么为了更快地转换到用户的目的activity,你应当让大量的操作尽量相对简单。

Note:当你的activity被暂停时,这个activity实例实际还在内存中,当它恢复时它又会被再次调用。你不必再次初始化任何在恢复状态之前创建的组件。

恢复你的activity

  当用户从暂停状态恢复到你的activity时,系统调用onResume()方法。

  你必须明白,系统在每次activity到前台的时候调用这个方法,包括它第一次被创建。正是这样,你必须实现onResume()方法,并在其中初始化那些在onPause()方法中被你释放掉的组件,还要做一些恢复状态必须做的初始化工作(比如开始动画,初始化一些只有在获取用户焦点时才能被使用的组件)。

  下面的例子是和上面onStop()方法对于的onResume()方法,它初始化了在暂停状态时被释放掉的摄像头。

@Overridepublic 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    }}
0 0
原创粉丝点击