【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 ...
随机推荐
- React入门---基础知识-大纲-1
-----------------在慕课网学习react入门笔记-------------- ---------博主边学边记录,手把手进行学习及记录---------- --------------- ...
- 【2017-05-17】WebForm
ASP.NET分为:ASP.NET WebForm和ASP.NET MVC 运行机制:C/S(客户端应用程序)代码在客户端执行,仅仅去服务器上的数据库存取数据 B/S(网站应用程序)程序代码在服务器上 ...
- 【JAVAWEB学习笔记】10_JDBC连接池&DBUtils
使用连接池改造JDBC的工具类: 1.1.1 需求: 传统JDBC的操作,对连接的对象销毁不是特别好.每次创建和销毁连接都是需要花费时间.可以使用连接池优化的程序. * 在程序开始的 ...
- Ubuntu热键控制spotify播放和音量调节
安装xbindkeys sudo apt-get install xbindkeys 新建配置文件 xbindkeys -d > ~/.xbindkeysrc 编辑热键 vim ~/.xbind ...
- springcloud(六):配置中心(一)
随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多.某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错.配置 ...
- OpenCV探索之路(十三):详解掩膜mask
在OpenCV中我们经常会遇到一个名字:Mask(掩膜).很多函数都使用到它,那么这个Mask到底什么呢? 一开始我接触到Mask这个东西时,我还真是一头雾水啊,也对无法理解Mask到底有什么用.经过 ...
- eclipse内存溢出设置
1. arguments中的内容添加红色部分: -Dcatalina.base="E:\workspace\.metadata\.plugins \org.eclipse.wst.s ...
- 开源网络操作系统--VyOS
User Guide Jump to: navigation, search Contents 1 Introduction 2 Installation 3 Using the Command-Li ...
- 冒泡排序的python代码实现
li = [33, 2, 10, 1,564,880,8,99,51,3]# for i in range(len(li) - 1):# current = li[i]# next_v ...
- [.NET跨平台]Jeuxs独立版本的便利与过程中的一些坑
本文环境与前言 之前写过一篇相关的文章:在.NET Core之前,实现.Net跨平台之Mono+CentOS+Jexus初体验 当时的部署还是比较繁琐的,而且需要联网下载各种东西..有兴趣的可以看看, ...