注:本文翻译自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. 将定期更新的影响最小化的更多相关文章

  1. 【Android Developers Training】 82. 序言:传输数据时减少对电池寿命的影响

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 104. 接受地点更新

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 107. 认知用户当前的行为

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 106. 创建并检测地理围栏

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 103. 查询当前地点

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 102. 序言:让你的应用获知地点

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 96. 运行一个同步适配器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 86. 基于连接类型修改您的下载模式

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 85. 不要有冗余的下载

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. dubbo 入门

    1 介绍 1.1 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 1.2 说明 DUBB ...

  2. 《大型网站系统与JAVA中间件实践学习笔记》-1

    第一章:分布式系统介绍 定义:分布式系统是一组分布在网络上通过消息传递进行协作的计算机组成系统. 分布式系统的意义 升级单机处理能力的性价比越来越低 单机处理器能力存在瓶颈 处于稳定性和可用性考虑 阿 ...

  3. SpringMVC + spring3.1.1 + hibernate4.1.0 集成及常见问题总结

    下载地址: http://pan.baidu.com/s/1qWDinyk 一 开发环境 1.动态web工程 2.部分依赖 hibernate-release-4.1.0.Final.zip hibe ...

  4. 微信第三方登录(原生)demo

    在一家ecstore二开公司有一段时间了,公司希望往自己研发产品上面走,一直在培养新人.   最近要自己去微信登录,自己就在ectore的框架基础上,写的原生微信第三方登录以此来熟悉微信第三方登录,在 ...

  5. Plotting trees from Random Forest models with ggraph

    Today, I want to show how I use Thomas Lin Pederson's awesome ggraph package to plot decision trees ...

  6. html或者php中 input框限制只能输入正整数,逻辑与和或运算

    有时需要限制文本框输入内容的类型,本节分享下正则表达式限制文本框只能输入数字.小数点.英文字母.汉字等代码. 例如,输入大于0的正整数 代码如下: <input onkeyup="if ...

  7. C#操作CAD-初始化、引用dll

    操作cad等方式有很多,比如C,C++,vb.lisp(效率最高,但是语言结构性太差)和C#,因为我等个人习惯和方便等原因,在此讲解一下用C#操作流程,后续会更新操作图层.扩展数据.绘图等操作步骤.当 ...

  8. 从零自学Hadoop(23):Impala介绍及安装

    阅读目录 序 介绍 安装 系列索引 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 序 上一篇, ...

  9. JAVA POI 应用系列(1)--生成Excel

    POI简介(官网:http://poi.apache.org/)     Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office ...

  10. poj3207

    poj3207 题意 平面上,一个圆,圆的边上按顺时针放着n个点.现在要连m条边, 比如a,b,那么a到b可以从圆的内部连接,也可以从圆的外部连接. 给你的信息中,每个点最多只会连接的一条边.问能不能 ...