转载自: http://blog.csdn.net/kesenhoo/article/details/7395253

Minimizing the Effect of Regular Updates[最小化定时更新操作的副作用]

  • 最佳的定时更新频率是不确定的,通常由设备状态,网络连接状态,用户行为与用户定义明确的偏好而决定。
  • Optimizing Battery Life(【Android Training - 04】优化电池寿命)这一章有讨论如何根据设备状态来修改更新频率。里面介绍了当断开网络连接的时候去关闭后台服务,在电量比较低的时候减少更新的频率。
  • 这一课会介绍更新频率是多少才会使得更新操作对无线电状态机的影响最小。
  • C2DM指数退避算法的使用

Use Cloud to Device Messaging as an Alternative to Polling[使用C2DM作为轮询方式之一]

关于Android Cloud to Device Messaging (C2DM)详情 ,请参考:http://code.google.com/intl/zh-CN/android/c2dm/

  • 每次app去向server询问检查是否有更新操作的时候会激活无线电,这样造成了不必要的能量消耗(在3G情况下,会差不多消耗20秒的能量)。
  • C2DM是一个用来从server到特定app传输数据的轻量级的机制。使用C2DM,server会在某个app有新数据的时候通知app有这个消息[有点像PUSH短信的类型]。
  • 比起轮询方式(app为了即时拿到最新的数据需要定时向server请求数据),C2DM这种有事件驱动的模式会在仅仅有数据更新的时候通知app去创建网络连接来获取数据[很显然这样减少了app的大量操作,当然也减少了很多电量]。
  • C2DM需要通过使用固定TCP/IP来实现操作。当在你的设备上可以实现固定IP的时候,最好使用C2DM。[这个地方应该不是传统意义上的固定IP,可以理解为某个会话情况下]。很明显,使用C2DM既减少了网络连接次数,也优化了带宽,还减少了对电量的消耗。

Optimize Polling with Inexact Repeating Alarms and Exponential Backoffs[通过不定时的重复提醒与指数退避来优化轮询操作]

  • 如果需要使用轮询机制,在不影响用户体验的前提下,当然设置默认更新频率是越低越好[减少电量的浪费]。
  • 一个简单的方法是给用户提供更新频率的选择,允许用户自己来处理如何平衡数据及时性与电量的消耗。
    • 当设置安排好更新操作后,可以使用不确定重复提醒的方式来允许系统把当前这个操作进行定向移动(比如推迟一会)。 
int alarmType = AlarmManager.ELAPSED_REALTIME;
long interval = AlarmManager.INTERVAL_HOUR;
long start = System.currentTimeMillis() + interval;
alarmManager.setInexactRepeating(alarmType, start, interval, pi);  

    • 若是多个提醒都被做了“定向移动”,那么很有可能到某个点同时被触发,那么这样就可以使得多个操作在同一个无线电状态下操作完。
    • 如果可以,请设置提醒的类型为ELAPSED_REALTIME or RTC而不是_WAKEUP。这样能够更进一步的减少在等待同时被触发的时候对电量的消耗。
    • 我们还可以通过根据app被使用的频率来有选择性的减少更新的频率。
  • 另一个方法在app在上一次更新操作之后还未被使用的情况下,使用指数退避算法(exponential back-off algorithm)来减少更新频率。当然我们也可以使用一些类似指数退避的方法。
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();  

  • 初始化一个网络连接的花费不会因为是否成功下载了数据而改变。我们可以使用指数退避算法来减少重复尝试(retry)的次数,这样能够避免浪费电量。例如:
private void retryIn(long interval) {  boolean success = attemptTransfer();  if (!success) {  retryIn(interval*2 < MAX_RETRY_INTERVAL ?   interval*2 : MAX_RETRY_INTERVAL);        }
}  

后记:这一课讲到C2DM与指数退避算法等,其实这些细节很值得我们注意,如果能在实际项目中加以应用,很明显质量会比较高。谢谢!

学习自:http://developer.android.com/training/efficient-downloads/regular_updates.html
转载请注明出处:http://blog.csdn.net/kesenhoo,谢谢!

转载于:https://www.cnblogs.com/0616--ataozhijia/p/4324438.html

[Android Traffic] 调整定时更新的频率(C2DM与退避算法)相关推荐

  1. android 一个activity定时更新另一个activity的UI

    在开发软件的过程中,客户提出了一个要求,就是在Mainactivity的一个按键button按下之后进入另一个OtherActivity,在这个OtherActivity完成了功能之后,按键butto ...

  2. [Android Traffic] 根据网络类型更改下载模式

    转载自: http://blog.csdn.net/kesenhoo/article/details/7396321 Modifying your Download Patterns Based on ...

  3. [Android Traffic] 使用缓存来避免重复的下载

    转载自: http://blog.csdn.net/kesenhoo/article/details/7395817 Redundant Downloads are Redundant[重复下载是冗余 ...

  4. Android 系统时间自动更新机制

    两种时间更新机制 NITZ NITZ(Network Identity and Time Zone,网络标识和时区),是一种用于自动配置本地的时间和日期的机制,同时也通过无线网向移动设备提供运营商信息 ...

  5. Android 系统时间自动更新机制--解决 “时间和日期不准确“

    两种时间更新机制 NITZ NITZ(Network Identity and Time Zone,网络标识和时区),是一种用于自动配置本地的时间和日期的机制,同时也通过无线网向移动设备提供运营商信息 ...

  6. AMD Ryzen 攒机记录及配置汇总(不定时更新)

    文章目录 最新配置汇总(定时更新) 2.电源 3.主板 预备知识 4.cpu 5.风扇 5.1机箱风扇 5.2cpu风扇 6.硬盘 Nvme .M2 SSD HDD 7.内存 插槽 超频 8.显卡 9 ...

  7. note4 android5.1.1,三星为Galaxy Note4推送Android 5.1.1更新

    [天极网IT新闻频道][Yesky新闻频道消息] 此前有消息称,国外非定制版三星 Galaxy S6和S6edge已经收到了安卓5.1.1的系统更新,而对于三星去年推出的平板手机Galaxy Note ...

  8. [XDOJ]日常作业汇总(不定时更新)

    [XDOJ]日常作业汇总(不定时更新) 事先声明: 1.该文章仅用于个人学习,谢绝未经本人同意和任何用于商业用途的搬运. 2.本人22级学生,学校题库内的题目可能会不定期更改题目要求,请各位参照答案的 ...

  9. 使用Service+BroadcastReceiver实现定时更新天气

    一.前言 最近两个月在做毕业设计:天气app,需要用到定时更新天气数据,用的是Service+BroadcastReceiver方法(之前对服务和广播也不是很了解,所以恶补了一下).关于这个方法我借鉴 ...

最新文章

  1. java美容美发项目下载_基于jsp的美容美发管理-JavaEE实现美容美发管理 - java项目源码...
  2. SpringBoot面试题(持续整理中……)
  3. jQuery的单引号双引号
  4. mysqldump: command not found
  5. 具体解释VB中连接access数据库的几种方法
  6. linux tar.gz指定目录,tar.gz包内提取某个文件在指定目录下。
  7. springboot下整合各种配置文件
  8. 利用Excel批量高速发送电子邮件
  9. CSS里各种垂直水平居中方式的基础用法
  10. 国产APP自动化测试工具AndroidRobot下载地址
  11. 安装net framework3.5提示需要.net framework3.5,错误代码0x800f081f
  12. Android 中this的用法
  13. [bzoj2144]: 跳跳棋
  14. Linux系统命令(电子邮件新闻组)
  15. “砍价”技巧受用终生
  16. 在金山云上,“雷布斯”有这些野心
  17. 714. [C++]买卖股票的最佳时机含手续费
  18. 如何批量将 bmp 格式图片转换转换为 jpg
  19. 数字化转型的行业分工和机会分析
  20. java.io.ioexception: 磁盘空间不足_System.IO.IOException: 磁盘空间不足

热门文章

  1. Spring Validation最佳实践及其实现原理,参数校验没那么简单!
  2. Elasticsearch 在各大互联网公司大量真实的应用案例!
  3. Java 的 JSP 已经被淘汰了吗?
  4. 目标检测模型从训练到部署!
  5. ICCV 2021 | 简而优:用分类器变换器进行小样本语义分割
  6. 参考文献必备神器:这个插件能快速知道收藏的论文是否靠谱
  7. 卷积神经网络必读的100篇经典论文,包含检测/识别/分类/分割多个领域
  8. 求解稀疏优化问题——增广拉格朗日方法+半光滑牛顿法
  9. 博士做机器视觉,我在华为当“网红”!
  10. 如何识别能把桥压塌的大车?快看!能救命!