最小化定期更新的影响

作者: rain 分类: 移动 发布时间: 2012-03-30 13:53 6 条评论

最佳的常规更新是和设备的状态、网络情况、用户行为以及用户当前的场景相关的。

提高电池寿命 介绍了如何创建高效使用电池的程序,这些程序会根据设备的状态来调整数据更新的策略。

这节内容将介绍如何使您的程序更新尽可能少的影响设备的无线信号。

使用 Cloud to Device Messaging 替代轮询

每当您的程序查询服务器是否需要更新数据的时候,您就激活了无线信号,开始无谓的消耗用户电量,在3G信号下会消耗掉用户设备大约20秒的无线信号电量。

Android Cloud to Device Messaging (C2DM) 是一种传输数据到程序的轻量级实现,当有新的数据可用的时候,服务器可以通知您的程序。

和轮询相比,这种主推形势的通知只会当有可用数据的时候才会建立数据连接。

结果就是减少了不需要的数据连接,同时还减少了程序更新数据的延时。

C2DM 通过持久的 TCP/IP 连接实现的。当然您也可以实现您自己的主推服务器,但是最好还是使用C2DM。这样可以减少持久连接的使用,从而系统可以优化带宽、电量使用等。

Optimize Polling with Inexact Repeating Alarms and Exponential Backoffs

当需要使用轮询的时候,尽量减少数据更新的频率,不要过分的影响用户体验。

一种简单的做法是提供一个设置项来设置更新频率,让用户自己在数据更新和电量消耗上做平衡。

当安排更新计划的时候使用不严格的重复通知(inexact repeating alarms),这样系统可以协调多个同时触发的通知事件。
When scheduling updates, use inexact repeating alarms that allow the system to “phase shift” the exact moment each alarm triggers.

如果多个通知被安排在相邻的时间触发,系统可以协调这些通知让他们同时触发,这样他们就可以重用同一个数据连接去更新数据了。

在允许的情况下,设置通知(alarm)的类型为 ELAPSED_REALTIME 或者 RTC而不要使用 _WAKEUP 类型通知。这样当系统不在空闲状态下才会触发这些通知,进一步的减少了对电量的消耗。

您还可以根据您的程序最近被使用的时间来合理的调整更新的时间来更进一步的减少更新频率。下面是一个实例:

One approach is to implement an exponential back-off pattern to reduce the frequency of your updates (and / or the degree of prefetching you perform) if the app hasn’t been used since the previous update. It’s often useful to assert a minimum update frequency and to reset the frequency whenever the app is used, for example:

当发生连接失败或者下载错误的时候,您可以应用同样的更新策略来减少对电量的消耗。

The cost of initiating a network connection is the same whether you are able to contact your server and download data or not. For time-sensitive transfers where successful completion is important, an exponential back-off algorithm can be used to reduce the frequency of retries in order to minimize the associated battery impact, for example:

Alternatively, for transfers that are failure tolerant (such as regular updates), you can simply ignore failed connection and transfer attempts.

本文出自 云在千峰,转载时请注明出处及相应链接。

本文永久链接: http://blog.chengyunfeng.com/?p=382

Ɣ回顶部