【Android Developers Training】 16. 暂停和恢复一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/basics/activity-lifecycle/pausing.html
在正常使用应用的过程中,在前台的activity有时候会被其它组件所遮挡,导致这个activity进入到暂停态。例如:当打开一个半透明activity(dialog中有这样一种风格),之前的activity会被暂停。只要这个activity仍然保持部分可见,同时当前没有获得用户焦点,它就会保持在暂停态。
然而,当一个activity被完全遮蔽,同时变得不可见,那么它将进入停止态(这块内容将在下一节课展开)。
当你的activity进入暂停态,系统将会对你的activity调用onPause()方法,这使得你可以停止那些在暂停态阶段不能继续进行的操作(比如一个正在播放的视频),或者存储一些信息,以防如果用户退出应用后丢失数据。如果用户从暂停态回到你的activity,系统会调用onResume()方法来恢复它。
Note:
当你的activity执行了onPause()方法,这表明activity可能会临时地暂停一下,用户可能会重新获得activity焦点。然而,它也通常可能意味着用户将要离开你的activity。

图1. 当一个半透明的activity遮挡了你的activity,系统会调用onPause()方法,然后activity在暂停态保持等待(1)。
如果用户回到这个activity时,activity处于暂停态,将会调用onResume()方法(2)。
一). 暂停你的Activity
当系统对你的Activity调用onPause()方法,从技术上说,这表明你的activity处于部分显示的状态,但多数情况这意味着用户将要离开activity,并且activity将要马上进入停止态。你应该经常在以下情况下使用onPause()回调函数:
- 停止那些会消耗CPU资源的动画或其它正在执行的操作
- 提交还未保存的修改(仅当用户希望当他们离开时这些变化会被永久的保存,比如:一个邮件草稿)
- 释放系统资源,比如广播接收器(broadcast receiver),对传感器(如: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()来存储用户的变更(比如在一个表单中填写的个人信息)到ROM中,只有在你确定用户期望这些改变(比如邮件草稿)应该被永久存储时,才应该在onPause()中把它们永久存储起来。然而,你应该避免在onPause()中执行大量消耗CPU资源的事务,比如写入数据库,因为这将会影响到下一个activity变化为可见状态的流畅度。(这些大量消耗资源的事务应该在onStop()方法中执行)
你应该尽量保持在onPause()中执行的操作相对简单,以此使得用户到下一个目的地的切换是流畅的(如果你的activity实际上已经进入了停止态)。
Note:
当你的activity处于暂停态,Activity实例会存储在RAM中,当这个activity恢复时,会重新从存储里调用。在activity切换到恢复态的过程中你不再需要重新初始化任何已经创建过的组件。
二). 恢复你的Activity
当用户将你的activity从暂停态恢复到恢复态时,系统会调用onResume()方法。
注意:每当你的activity来到前台时,系统都会调用这个方法,包括当它第一次被创建时。例如:你应该在onResume()中初始化那些你在onPause()方法中释放的组件,并且完成其他当activity进入恢复态时必须执行的初始化操作。(例如启动一些动画,以及初始化那些只有activity获取了用户焦点时才会被使用的组件)
下面这个onResume()例子对应于上述onPause()的例子,它初始化了当activity进入暂停态时释放的相机:
@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
}
}
【Android Developers Training】 16. 暂停和恢复一个Activity的更多相关文章
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 18. 重新创建一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 14. 序言:管理Activity生命周期
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android-管理Activity生命周期 -暂停和恢复一个Activity
在正常的使用app时,前台的activity有时候会被可见的组件阻塞导致activity暂停.比如,当打开一个半透明的activity(就像打开了一个对话框),之前的activity就会暂停.只要ac ...
- 【Android Developers Training】 0. 序言:构建你的第一个应用
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 17. 停止和重启一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 15. 启动一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 21. 创建一个可变动的UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- JAVA的节点流和处理流
节点流:可以从或向一个特定的地方(节点)读写数据.如FileReader. 处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写.如BufferedReader.处理流的构造方 ...
- 使用configuration配置结束在quartz.net中使用硬编码Job,Trigger任务提高灵活性
经常在项目中遇到定时任务的时候,通常第一个想到的是Timer定时器,但是这玩意功能太弱鸡,实际上通常采用的是专业化的第三方调度框架,比如说 Quartz,它具有功能强大和应用的灵活性,我想使用过的人都 ...
- NancyFx 2.0的开源框架的使用-Caching
新建一个空的Web项目,命名CachingDemo 然后添加三个Nuget安装包 Nancy Nancy.Hosting.Aspnet Nancy.ViewsEngines.Razor 然后往项目里面 ...
- python 冒泡排序,递归
冒泡排序:li = [33, 55, 58, 66, 58, 555,20000000000000000000000, 5555,5555, 5, 6, 62,1]for i in range(1,l ...
- [Angularjs]$http.post与$.post
摘要 在angularjs发送post请求的时候,确实很困惑,在传递json数据的时候,总会遇到在服务端无法接受到参数的情况,这里有必要与$.post进行比较学习一下. 一个例子 这里模拟登录的一个场 ...
- application 从web.xml中获取初始化参数
<span style="font-size:24px;"> </span> 1.web.xml中的配置部分 <context-param> ...
- javaWeb学习总结(3)- Servlet总结(servlet的主要接口、类)
Servlet总结01——servlet的主要接口.类 (一)servlet类 Servlet主要类.接口的结构如下图所示: 要编写一个Servlet需要实现javax.servlet.Servlet ...
- 纯css实现多标签浮动居中(任意个数)
在做的一个网页上有一块要用浮动标签,具体就是网页底部有未知数量,未知尺寸的元素要水平居中,有点类似于分页器. 首先,我们先新建一个容器con,就是标签的爸爸,用来控制标签在页面的位置,.father{ ...
- (转+原创)java的枚举类型Enum解释
原文:http://www.cnblogs.com/mxmbk/articles/5091999.html 下文中还添加了个人的一些补充和理解. 在Java SE5之前,我们要使用枚举类型时,通常会使 ...
- JavaScript 函数(方法)的封装技巧要领及其重要性
作为一枚程序猿,想必没有人不知道函数封装吧.在一个完整的项目开发中,我们会在JS代码中对一些常用(多个地方调用)的操作进行一个函数的封装,这样便于我们调试和重复调用,以致于能够在一定程度上减少代码的冗 ...