您的位置:首页 > 其它

安卓训练-开始-管理 Activity 生命周期-暂停和恢复 Activity

2014-11-12 13:26 295 查看


暂停和恢复 Activity

上一课

下一课

这节课教你

暂停你的 Activity
恢复你的 Activity

你还需要阅读

Activities

试试
下载示例ActivityLifecycle.zip

在应用的使用过程中,有些时候前台 activity 会被其他可视组件阻塞,导致这个 activity 暂停。例如,当一个半透明的 activity 打开时(比如一个半透明对话框),前一个 activity 暂停。只要这个 activity 部分可见并且不是当前聚焦的 activity,它将保持暂停状态。

但是,一旦这个 activity 完全阻塞并且不再可见,它就停止了(在下节课中讨论)。

当你的 activity 进入暂停状态,系统调用你的
Activity
onPause()

方法,这允许你停止正在执行的当暂停后不应该再继续的操作(比如一个视频)或持久化应该被长期保存的任何信息以防用户离开你的应用。如果用户从暂停状态回到你的 activity,系统将恢复它并调用
onResume()
方法。

注意:当你的 activity 收到一个
onPause()
调用,这表示你的 activity 将被暂停一段时间然后用户会回来。但是,这通常是用户离开你的 activity 的第一步。



图 1. 当一个半透明的 activity 阻塞你的 activity,系统调用
onPause()

然后 activity 在 Paused 状态等待 (1)。如果用户回到还在暂停中的 activity,系统调用
onResume()
(2)。

暂停你的 Activity

当系统调用你的 activity 的
onPause()
,在技术上这意味着你的 activity 仍是部分可见的,但通常都表示用户正离开这个 activity 并且一会它将进入 Stopped 状态。你通常使用
onPause()

回调方法:

停止动画或其他正在执行的消耗 CPU 的操作。
提交未保存的当用户离开时他们期望长期保存的变化(比如电子邮件草稿)。
释放系统资源,比如广播接收者,传感器(比如 GPS)处理器,或当你的 activity 暂停并且用户不再需要的 可能影响电池生命的任何资源。

例如,如果你的应用使用
摄像头
onPause()

方法是释放它的好地方。

@Override
public void onPause() {
super.onPause();  // 总是先调用超类方法

// 释放摄像头,因为在暂停时我们不需要它并且其他 activity 可能需要使用它。
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}

通常,你应该使用
onPause()
把用户变化(比如表单中输入的个人信息)存入持久化存储。只有当你确定用户期望变化被自动保存(比如在写电子邮件草稿时)时,才使用
onPause()

把用户变化存入持久化存储。但是,你应该避免在
onPause()
中执行 CPU 密集型操作,比如写入数据库,因为这会减慢到下一个 activity 的可视界面的转变(作为替代,你应该在
onStop()

中执行高负载的关闭操作)。

如果你的 activity 实际上被停止,为了让用户快速转变到下一个目的地,你在
onPause()
方法中执行的操作的量应该比较少。

注意:当你的 activity 被暂停,
Activity
实例仍驻留在内存中,并且在 activity 恢复时会唤醒它。你不需要重新初始化那些在 Resumed 状态之前的任何回调方法中创建的组件。

恢复你的 Activity

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

需要意识到,每次你的 activity 来到前台时,包括它第一次被创建,系统调用这个方法。因此,你需要实现
onResume()
,初始化你将在
onPause()

中释放的组件,并执行每次进入 Resumed 状态都需发生的其他任何操作(比如启动动画和初始化只有在 activity 有用户焦点时才使用的组件)。

下面是
onResume()
的例子,与前面的
onPause()

例子相对应,初始化当 activity 暂停时释放的摄像头。

@Override
public void onResume() {
super.onResume();  // 总是先调用超类方法

// 当 activity 获得完全用户焦点时,取得摄像头实例
if (mCamera == null) {
initializeCamera(); // 初始化摄像头的局部方法
}
}


上一课下一课
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐