Android Training - 暂停和恢复一个Activity

时间:2022-02-06 14:54:11
在正常的程序使用中,处于前台运行的activity有时会被另外一些可见的组件遮挡,从而造成activity被暂停。比如,一个半透明的activity(类似一个对话框)被打开,先前那个activity就会被暂停。虽然这个activity还有部分可见,但是当前的焦点不在这个activity上,因此它保持在paused状态。

不过,一旦这个activity被全部遮挡,处于不可见的状态,那么它就是被停止了。(下个教程讨论)

如果你的activity要进入paused状态,系统会调用你的activity种的onPause()方法,这个方法让你能够暂停那些不应该继续运行的行为(比如暂停视频播放),或者保存那些应该永久保存的用户数据。一旦用户从paused状态返回,系统能够调用onResume()方法恢复以前的运行。

提示:当activity接收调用onPause()时,这可能表明activity要暂时进入paused状态,用户可能马上就重新获得activity的焦点。但是,它也是用户离开这个activity时会调用的第一个方法。
Android Training - 暂停和恢复一个Activity
图解:当一个半透明的activity覆盖你的activity时,系统调用onPause(),activity就会在Paused状态中等待(1)。系统调用onResume()方法返回activity。

暂停你的activity

当系统调用onPause()方法的时候,技术上说明activity还是能部分可见的,但是大部分情况表明用户要离开activity,它将进入Stopped状态。你通常使用onPause()函数做下面的事:
  • 停止消耗cpu的动画或者运行中的动作。
  • 提交未保存的更改,但是只是保存用户离开后期望永久保存的东西(比如邮件草稿)。
  • 释放系统资源,比如广播接收器,传感器(比如GPS),或者消耗电量的资源,这些资源是activity暂停后用户不再需要的。
例如,如果你的程序需要使用摄像头,onPause()方法中是释放它的好地方。
    @Override
    public void onPause() {
        super.onPause();  // 通常先调用父类方法

        // 释放摄像头资源
        if (mCamera != null) {
            mCamera.release()
            mCamera = null;
        }
    }

通常情况下,你不需要使用onPause()方法储存用户的修改(比如填写信息的表单)到固定存储器。只有在用户真的期望自动保存数据(比如邮件草稿)的时候才需要在onPause()方法中保存。你应该尽量避免在onPause()方法中让CPU进行密集的工作,比如写入数据到数据库,因为这样会减慢你进入下一个activity的速度(你应该在onStop()中执行这些高负载的关闭操作)。

如果你的activity确实需要被停止话,你应该保持你onPause()方法尽量的简单,这样能够保证快速的转换到用户的下一个目的地。

提示:当你的activity已经被paused,这个activity实例会被保持在内存中,当activity需要被恢复的时候被调用。你不需要再重新初始化组件。

恢复你的activity

当用户从Paused状态恢复你的activity的时候,系统调用onResume()函数。

需要了解的是activity每次进入前台都会调用这个方法,包括activity被第一次创建的时候。这样的话,你必须在onResume()方法中初始化那些onPause()中释放的组件,并且执行任何需要在Resumed状态中需要的初始化工作。(比如开始动画和初始化activity前台状态需要的组件)

下面的例子和上面onPause()的例子相对应,这里初始化暂停时释放的摄像头资源。
    @Override
    public void onResume() {
        super.onResume();  // 调用父类方法

        // 当activity取得用户焦点时取得摄像头实例
        if (mCamera == null) {
            initializeCamera(); // 摄像头初始化的本地方法
        }
    }