注:本文翻译自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. WinRAR5.01注册码附注册机

    把下面的注册码复制到"记事本"中,另存为"rarreg.key"文件,放到WinRAR安装目录即完成注册.RAR registration datakjcy8U ...

  2. 【SoDiaoEditor电子病历编辑器】阶段性更新--新增复选框、日期控件、表格排版支持等

    转眼距离上一次v2正式发布已经过去一个半月了.github期间不定期push了二十几次,同时感谢分布在广州.福建.上海.北京的一众小伙伴,正是你们给出的建议,才让SoDiaoEditor不断完善. 我 ...

  3. JEESZ-kafka消息服务平台实现

    JEESZ的消息服务平台已经抛弃了之前的ActiveMQ,改用高吞吐量比较大的Kafka分布式消息中间件方案:JEESZ-kafka消息平台使用spring+kafka的集成方案,详情如下:1. 使用 ...

  4. jQuery.validate表单校验+bootstrap

    谈谈表单校验 这大概是一种惯例,学习前台后台最开始接触的业务都是用户注册和登录.现在社会坚持以人为本的理念,在网站开发过程同样如此.User是我们面对较多的对象,也是较核心的对象.最开始的用户注册和登 ...

  5. Brief introduction to Cassandra 【Cassandra简介】

    From wikipedia  https://en.wikipedia.org/wiki/CAP_theorem In theoretical computer science, the CAP t ...

  6. JBoss 主要模块

    JBoss EJB 容器是JBoss 服务器的核心实现.它有两个特征,第一个是在运行期间生产EJB对象的Stub 和Skeleton 类, 第二是支持热部署. JBossNS 是JBoss 命名服务用 ...

  7. Java Garbage Collectors

    Generational Collectors (分代收集器) GC algos optimised based on two hypotheses / observations: Most obje ...

  8. (数字IC)低功耗设计入门(一)

    低功耗设计这个专题整理了好久,有一个月了,有图有证据: 然而最近一直有些烦心事.郁闷事,拖延了一下,虽然现在还是有点烦,但是还是先发表了吧.下面我们就来聊聊低功耗设计吧,由于文章比较长,因此我就不一次 ...

  9. itmacy_我的博客

    开通博客的第一天,并不希望自己以后像写流水账一样来写自己的博客,而是希望每一篇博客,无论是转载还是原创,都是经过深思熟虑,并且有意义的...

  10. python unittest 测试笔记(二):使用Requests

    1. Requests 唯一的一个非转基因的 Python HTTP 库,人类可以安全享用.[Python Requests快速入门 :]http://cn.python-requests.org/z ...