AlarmManager机制和系统唤醒锁的总结

转自 http://blog.csdn.net/d_clock/article/details/42968039

前段时间,在公司做项目的时候发现原有项目中的代码在Service中使用handler不断发送Message到Looper处理MessageQueue中来维持IM功能的“心跳”,心里瞬间觉得这个地方的代码很不靠谱,主要原因分为两个:

1.handler的生命周期和Service不一致,如果Service某个时刻被系统回收内存杀死了,逻辑上handler应该就会停止心跳包的发送,但是此时实际代码运用中handler依旧可以源源不断的发送消息,而且由于handler持有了外部销毁的Service的引用,造成Service即使被杀但是内存不被回收的内存泄漏问题也是比较严重的;

2.Android官方的API文档建议我们,如果要执行定时任务的话,可以使用AlarmManager来定期执行任务,减少唤醒系统时钟的次数,从而减少电量的消耗;

针对以上问题,做了一下小小了解,因为项目开发中我对于AlarmManager的使用已经相当熟悉,但是对系统唤醒锁的概念还是不是很理解,之前甚至天真的认为,只要锁了屏,系统锁就不会被唤醒,亮屏的时候,系统唤醒锁才重新唤醒。可是想想又不太对,系统在锁屏的时候,如果我们设置了闹钟提醒的功能,时间到了之后,闹钟就会响起来,这恰恰说明了锁屏的时候系统锁仍旧被唤醒工作,估计系统提供AlarmManager给开发者使用,只是为了让系统唤醒锁的次数交给统一的管理者管理,这样可以降低锁频繁被唤醒的几率,从而达到节能的目的,对此我也对AlarmManager和系统时钟的概念做了以下一些小小的总结:

Android手机有两个处理器,一个叫ApplicationProcessor(AP),一个叫BasebandProcessor(BP)。AP是ARM架构的处理器,用于运行Linux+Android系统;BP用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上。非通话时间,BP的能耗基本上在5mA左右,而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高。另外LCD工作时功耗在100mA左右,WIFI也在100mA左右。一般手机待机时,AP、LCD、WIFI均进入休眠状态,这时Android中应用程序的代码也会停止执行。Android为了确保应用程序中关键代码的正确执行,提供了WakeLock的API,使得应用程序有权限通过代码阻止AP进入休眠状态。但如果不领会Android设计者的意图而滥用Wake Lock API,为了自身程序在后台的正常工作而长时间阻止AP进入休眠状态,就会成为待机电池杀手。

首先,完全没必要担心AP休眠会导致收不到消息推送。通讯协议栈运行于BP,一旦收到数据包,BP会将AP唤醒,唤醒的时间足够AP执行代码完成对收到的数据包的处理过程。其它的如Connectivity事件触发时AP同样会被唤醒。那么唯一的问题就是程序如何执行向服务器发送心跳包的逻辑。你显然不能靠AP来做心跳计时。Android提供的AlarmManager就是来解决这个问题的。Alarm应该是BP计时(或其它某个带石英钟的芯片,不太确定,但绝对不是AP),触发时唤醒AP执行程序代码。那么WakeLock API有啥用呢?比如心跳包从请求到应答,比如断线重连重新登陆这些关键逻辑的执行过程,就需要WakeLock来保护。而一旦一个关键逻辑执行成功,就应该立即释放掉Wake Lock了。两次心跳请求间隔5到10分钟,基本不会怎么耗电。除非网络不稳定,频繁断线重连,那种情况办法不多。

时间: 2024-10-03 17:48:21

AlarmManager机制和系统唤醒锁的总结的相关文章

Android* 的唤醒锁

Android* 的唤醒锁 WakeLock_WhitePaper.docBSD2.0.txtWakeLock.zip Christopher Bird Android 电源管理 - 唤醒锁全新上市 大多数人可能都遭遇过手机的电池续航时间较短带来的尴尬. 这极其令人讨厌. 没电的手机和一块水泥砖没什么差别. 一般而言,如果用户的手机电池无法持续一整天,他们会感到非常不满.而且,当手机充电时用户无法使用手机,这同样会带来极大的不便. 传统上需要使用笔记本电脑或 PC 处理的任务,现在借助全新的改进

解决win7系统唤醒休眠状态出现“拒绝访问”错误的方法

  windows休眠状态是指将所有运行的实时数据存储到硬盘上,并且关闭一切不必要的硬件从而节省电量,无论你所使用的windows是哪个版本,系统都能够让用户自动进入休眠状态,当然在你没有关闭休眠功能的前提下,不过在近期有部分win7用户反映,将系统从休眠状态唤醒时,出现"拒绝访问"的错误,对于该问题我们如何解决呢?下面看为您带来的解决方法! 解决win7系统唤醒休眠状态出现"拒绝访问"错误的方法 第一步.进入Win7系统后,我们在键盘中按"Win+R&q

windows8系统轻松锁屏技巧

  windows8系统轻松锁屏技巧:安装了win8系统的用户都会知道,每次启动Win8的登录界面屏幕便会被一副背景的图片锁住,不熟悉Win8系统的用户可能会傻傻地在干等,其实Win8可以像我们的手机操作一样,只需鼠标左键按住不放,然后轻轻的往上一拖即可进入登录界面或桌面.接下面跟小编一起来看看有什么技巧能够让我们更好地玩转锁屏! 一.win8快速锁屏技巧 1.使用快捷键Win + L即可快速锁频! 2.使用快捷键Ctrl + Alt + Del,然后选择"锁定"即可! 3.单击桌面左

Windows8系统个性化锁屏界面设置方法图文教程

  Windows8系统个性化锁屏界面设置方法图文教程         Windows 8系统启动完成之后,最先映入大家眼帘的就是锁屏界面,我们用手指或者鼠标将锁屏背景图片向上拖动,也可以按下鼠标或键盘,锁屏"大幕"将向上拉开显出Win8登录界面,输入密码后就可以开启Win8的愉快旅程.作为跨平台且看重移动互联的新一代操作系统,Windows 8在界面和功能设计方面都不少新鲜的变化,锁屏自然也不例外,除了可以让用户自己设置喜欢的锁屏背景图片之外,Win8更增添了应用状态在锁屏界面的显

能否通过反射机制获取系统电话com.android.phone的实例,并执行其中一些方法

问题描述 能否通过反射机制获取系统电话com.android.phone的实例,并执行其中一些方法???? 问题补充:我想实现这么一个事情,就是在非人工通话的过程中,不用按数字按钮(也比如返回到手机桌面了),然后也能发送某个数字按键,比如自动选择了1号键,又或者是选择了*号键 解决方案 java反射有很多例子的 网上找找 Class phone= Class.forName("com.android.phone"); com.android.phone phoneInstance =

设置Android系统永不锁屏永不休眠的方法_Android

在进行Android系统开发的时候,有些特定的情况需要设置系统永不锁屏,永不休眠.本篇文章给大家介绍Android 永不锁屏,开机不锁屏,删除设置中休眠时间选项,需要的朋友一起学习吧. Android 6.0.1 Create:2016-02-29 1.Settings 删掉屏幕待机选项 packages/apps/Settings/res/xml/display_settings.xml <!-- Hide screen sleep <ListPreference android:key=&

Android系统永不锁屏永不休眠的方法_Android

开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠,有两种方式:              一种是添加权限,              一种是代码中设置, 建议使用第一种方式,这样,在安装程序的时候会进行提醒: 第一种方式: 在Manifest.xml文件里面用user-permission声明 名称为:android.permission.WAKE_LOCK 第二种方式: getWindow().setFlags(WindowMan

MIUI7系统手机锁屏画报怎么设置

开启方法: ?我们在MIUI7系统中点击桌面的[设置]之后我们再在界面中点击[壁纸]效果如下图所示 ?之后再进入到壁纸界面中我们再点击[选择新的壁纸]效果如下图所示 ?然后你就可以看见[锁屏画报]了 ?锁屏画报提供了4个选择,我们根据自己的喜好来选择分类了,效果如下图所示 缺点:应用后,画报只在每天的凌晨自动更换,而不是几分钟或者每小时更换 好了这样关于MIUI7系统手机锁屏画报怎么设置完了,希望文章能够帮助到各位朋友,有兴趣的朋友可以进来看看吧,希望文章能够帮助到各位.

Android系统永不锁屏永不休眠的方法

开发Android程序时,有时候在程序运行的时候,不能让系统休眠,否则有一些运行会停止,因此我们需要设置禁止休眠,有两种方式: 一种是添加权限, 一种是代码中设置, 建议使用第一种方式,这样,在安装程序的时候会进行提醒: 第一种方式: 在Manifest.xml文件里面用user-permission声明 名称为:android.permission.WAKE_LOCK 第二种方式: getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEE