【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 ...
随机推荐
- hexo从零开始到搭建完整
前言 其实平时自己写的文章并不多,偶尔看到一些东西会做点笔记,但是每次写的东西都会到处放,不好找,所以才想着自己搭建一个人博客网站,现在大家用hexo比较多,也比较方便,并且能使用的主题也很多,所以小 ...
- 底层算法系列:Paxos算法
关于算法,面太广.本系列只研究实际应用中遇到的核心算法.了解这些算法和应用,对java码农进阶是很有必要的. 对于Paxos学习论证过程中,证实一句话:有史以来学习paxos最好的地方wiki:Pax ...
- 消息:SQL Server 2017(vNext)的第三个公开的CTP(社区技术预览版)发布了
今天看到了一个新闻,跟大家分享一下,有兴趣的可以去尝试一下. SQL Server 2017 CTP3于5月23日发布了,详细版本号是6.7.55.0. 大家可以去安装试试.在下载页面,目前是SQL ...
- Lambda语言篇 —— lambda, 方法引用, 目标类型和默认方法
本文介绍了Java SE 8中新引入的lambda语言特性以及这些特性背后的设计思想.这些特性包括: lambda表达式(又被成为"闭包"或"匿名方法") 方法 ...
- JS简单实现自定义右键菜单
RT,一个简单的例子,仅仅讲述原理 <div id="menu" style="width: 0;height: 0;background: cadetblue;p ...
- SG函数和SG定理【详解】
在介绍SG函数和SG定理之前我们先介绍介绍必胜点与必败点吧. 必胜点和必败点的概念: P点:必败点,换而言之,就是谁处于此位置,则在双方操作正确的情况下必败. N点:必胜点 ...
- SpringMVC——数据校验
数据校验在web应用里是非常重要的功能,尤其是在表单输入中.在这里采用Hibernate-Validator进行校验,该方法实现了JSR-303验证框架支持注解风格的验证. 一.导入jar包 若要实现 ...
- window.opener的用法
window.opener 主要用来打开窗体的父窗体,可以通过这种方式设置父窗体的值或者调用js方法. 例如: 1,window.opener.test(); ---调用父窗体中的test()方法 2 ...
- Eclipse导入项目常见问题----服务器版本问题02
*有时导入项目时,我们打开build时会看到服务器包上有一个红色的×,和这里JRE System jar包显示的是一个样的,左侧有个红色叉: 解决办法 打开到如下界面,解决步骤如下图: 打开该界面方式 ...
- js 玩一玩
闲着没事学了学js,做了一个下页面玩玩. 下面是html代码: <!DOCTYPE html><html> <head> <meta charset=&quo ...