【Android Developers Training】 84. 将定期更新的影响最小化
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/efficient-downloads/regular_updates.html
对于定期更新频率的优化会基于设备的状态,网络连接,用户行为和其喜好而有所变化。
我们在这一大系列课中,我们讨论如何构建具有电池效率的应用,它们可以基于设备的状态而调整刷新频率。具体而言,包括了当你丢失了连接时,关闭后台更新服务,以及当电量低时降低更新的频次。
这节课将探讨,在无线状态机中,更新的频率可以如何调整,以最小化后台更新所造成的影响。
一). 使用谷歌云消息(Google Cloud Messaging)来代替轮询
每当你的应用轮询服务来检查是否有更新时,你就会启动无线电设备,造成一些可能不必要的电量损失,对于一个标准3G网络来说,至少需要消耗掉20秒的时间。
Google Cloud Messaging for Android (GCM)是一种轻量化的机制,可以被用来从一个服务到一个特定应用实体进行数据的传输。使用GCM,你的服务可以通知一个运行在特定设备上的应用有一个新的数据可以获取。
相较于轮询,你的应用必须定期地ping服务器来查询是否有新数据,而这一基于事件驱动的模型允许你的应用仅在它知道有数据要下载时才创建一个新的连接。
结果就是减少了不必要的连接,并在你的应用中减少了更新数据的时间。
GCM是使用TCP/IP长连接来实现的。它可以实现你自己的推送服务,使用GCM将是一个不错的选择。它能最小化长连接数目并允许平台优化带宽,最小化对电池寿命的影响。
二). 使用非精确重复提醒和指数退避来优化轮询
在需要轮询时,我们最好尽量将你应用的默认数据更新频次设置的低,但却不影响用户的体验。
一种简单地方法是提供设置选项,让用户可以自行设置他们所需的更新频率,允许他们自己在数据更新与电池寿命之间做出平衡。
当使用计划更新时,使用非精确重复提醒可以允许系统在每一次提醒发生的时刻,做出一些时间上的推移。
int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval; alarmManager.setInexactRepeating(alarmType, start, interval, pi);
如果一些提醒都被计划于间隔某一小段时间后被激活,那么这一机制可以让它们同时激活,允许每一个更新的完成仅依靠了一个单一的无线电状态切换。
尽可能地将你的提醒类型设置为“ELAPSED_REALTIME”或者“RTC”而不是“_WAKEUP”。因为这可以使得提醒处于等待状态,直到电话不再是待机模式后再被激活,从而进一步减少了对电池寿命的影响。
你还可以进一步减小这些计划提醒的影响,方法是基于你的应用使用的频次,减小计划提醒的频率。
一种方法是:如果应用自上次更新后再也没有被使用,那么实现一个指数退避模式来减小更新的频率(和/或你执行预取的频率)。通常可以声明一个最小的更新频率,一旦应用被使用了就重置该更新频率,例如:
SharedPreferences sp =
context.getSharedPreferences(PREFS, Context.MODE_WORLD_READABLE); boolean appUsed = sp.getBoolean(PREFS_APPUSED, false);
long updateInterval = sp.getLong(PREFS_INTERVAL, DEFAULT_REFRESH_INTERVAL); if (!appUsed)
if ((updateInterval *= 2) > MAX_REFRESH_INTERVAL)
updateInterval = MAX_REFRESH_INTERVAL; Editor spEdit = sp.edit();
spEdit.putBoolean(PREFS_APPUSED, false);
spEdit.putLong(PREFS_INTERVAL, updateInterval);
spEdit.apply(); rescheduleUpdates(updateInterval);
executeUpdateOrPrefetch();
你也可以使用指数退避的方法来减少连接失败和下载错误所造成的影响(译者注:指数退避的思想在TCP/IP体系结构中,链路层的CSMA/CD协议里也有所体现)。
不管你是否能够连接到你的服务器并下载数据,初始化一个网络连接的代价都是一样的。对于是否传输成功很重要的时间敏感的传输,指数规避算法可以被用来减少重试的频率来减少对电池寿命的影响,例如:
private void retryIn(long interval) {
boolean success = attemptTransfer();
if (!success) {
retryIn(interval*2 < MAX_RETRY_INTERVAL ?
interval*2 : MAX_RETRY_INTERVAL);
}
}
相反的,对于可以容忍传输失败的传输(如计划更新),你可以简单地忽略连接和传输尝试。
【Android Developers Training】 84. 将定期更新的影响最小化的更多相关文章
- 【Android Developers Training】 82. 序言:传输数据时减少对电池寿命的影响
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 104. 接受地点更新
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 107. 认知用户当前的行为
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 106. 创建并检测地理围栏
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 103. 查询当前地点
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 102. 序言:让你的应用获知地点
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 96. 运行一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 86. 基于连接类型修改您的下载模式
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 85. 不要有冗余的下载
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- 区别client、offset、scroll系列以及event的几个距离属性
element元素结点属性 一. offset系列 1.offsetWidth 和offsetHeight element.offsetWidth是一个只读属性,它包括了: css width + p ...
- 深入理解JAVA序列化
如果你只知道实现 Serializable 接口的对象,可以序列化为本地文件.那你最好再阅读该篇文章,文章对序列化进行了更深一步的讨论,用实际的例子代码讲述了序列化的高级认识,包括父类序列化的问题.静 ...
- PHP 中级内容
1.面向对象编程(OOP) 2.模板引擎(smarty) 3.MYSQL(中级操作) 数据库抽象层(PDO): 4.Ajax(异步刷新) 5.Js框架(jQuery) Xml+JSON数据 ...
- Java IO详解(五)------包装流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- 学习笔记TF010:softmax分类
回答多选项问题,使用softmax函数,对数几率回归在多个可能不同值上的推广.函数返回值是C个分量的概率向量,每个分量对应一个输出类别概率.分量为概率,C个分量和始终为1.每个样本必须属于某个输出类别 ...
- iOS开发常用第三方开源框架 持续更新中...
键盘管理 TPKeyboardAvoiding IQKeyboardManager(1.2.8) 弹窗HUD MBProgressHUD(0.9.2) SVProgressHUD UIView+Toa ...
- 企业账号打包如何通过HTML页面打开
企业账号打包后 Plist文件加入前缀 href="itms-services://?action=download-manifest&url= Plist文件在服务器中的地址为:h ...
- 《JAVA与模式》之命令模式
在阎宏博士的<JAVA与模式>一书中开头是这样描述命令(Command)模式的: 命令模式属于对象的行为模式.命令模式又称为行动(Action)模式或交易(Transaction)模式. ...
- RabbitMQ 应用学习随笔
1.安装 Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装RabbitMQ之前要先安装Erlang. erlang:http://www.erlang.org/download. ...
- SQL Server AG集群启动不起来的临时自救大招
SQL Server AG集群启动不起来的临时自救大招 背景 前晚一朋友遇到AG集群发生来回切换不稳定的情况,情急之下,朋友在命令行使用命令重启WSFC集群 结果重启WSFC集群之后,非但没有好转,导 ...