Activity的生命周期(二)

翻译自官方文档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()方法就是一个释放它的不错地方。

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

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

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

恢复你的activity

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

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

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

@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
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值