zoukankan      html  css  js  c++  java
  • WakeLock, AlarmManager, JobScheduler

    应用程序耗电的实质,是所启用的硬件在消耗电量。  

    手机的耗电单元 
    CPU: 应用处理器(AP)和基带处理器(BB或BP) 

    GPU(图形处理单元)

    外设:wifi,BT, GPS,LCD等  

    AP是ARM架构的处理器,用于运行Android系统;

    BP用于运行实时操作系统(RTOS),通讯协议栈运行于BP的RTOS之上.

    耗电量对比:

    BP非通话时间的能耗基本上在5mA左右; 而AP只要处于非休眠状态,能耗至少在50mA以上,执行图形运算时会更高, 另外 LCD, WIFI等更高。

    一般手机待机时,AP、LCD、WIFI均进入休眠状态,这时Android中应用程序的代码也会停止执行,只会有基带处理器(BP)的耗电。 

    为什么微信比短信耗电严重很多呢? 答案就是短信使用BP耗电小, 而微信使用AP耗电大.


    WakeLock机制:

    Android为了确保应用程序中关键代码的正确执行,提供了Wake Lock的API,使得应用程序有权限通过代码阻止AP进入休眠状态。 
    WakeLock阻止应用处理器(AP)挂起,确保关键代码的运行,通过中断唤起应用处理器(AP),可以阻止屏幕变暗。所有的WakeLock被释放后,系统会挂起。  
    PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); 

    WakeLock sCpuWakeLock = pm.newWakeLock( 
                    PowerManager.FULL_WAKE_LOCK | 
                    PowerManager.ACQUIRE_CAUSES_WAKEUP,"okTag"); 

     if (sCpuWakeLock!= null) {          

     sCpuWakeLock.release(); 

              sCpuWakeLock = null; 

    }


    PARTIAL_WAKE_LOCK:保持CPU 运转,屏幕和键盘灯有可能是关闭的。 
    SCREEN_DIM_WAKE_LOCK:保持CPU 运转,允许保持屏幕显示但有可能是灰的,允许关闭键盘灯 
    SCREEN_BRIGHT_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,允许关闭键盘灯 
    FULL_WAKE_LOCK:保持CPU 运转,保持屏幕高亮显示,键盘灯也保持亮度 
    ACQUIRE_CAUSES_WAKEUP:不会唤醒设备,强制屏幕马上高亮显示,键盘灯开启。有一个例外,如果有notification弹出的话,会唤醒设备。 
    ON_AFTER_RELEASE:WakeLock 被释放后,维持屏幕亮度一小段时间,减少WakeLock 循环时的闪烁情况
    如果申请了partial wakelock,那么即使按Power键,系统也不会进Sleep,如Music播放时; 如果申请了其它的wakelocks,按Power键,系统还是会进Sleep.(参见api文档)

    但如果不领会Android设计者的意图而滥用Wake Lock API,为了自身程序在后台的正常工作而长时间阻止AP进入休眠状态,就会成为待机电池杀手。 

    AlarmManager 
    AlarmManage有一个AlarmManagerService,该服务程序主要维护app注册下来的各类Alarm, 并且一直监听Alarm设备, 一旦有Alarm触发,或者是Alarm事件发生,AlarmManagerService就会遍历Alarm列表,找到相应的注册Alarm并发出广播. 首先,Alarm是基于RTC实时时钟计时, 而不是ap计时; 其次, Alarm会维持一个CPU的wake lock, 确保Alarm广播能被处理.

    AlarmManager在Alarm指定的Receiver的onReceive()方法执行期间持有一个CPU唤醒锁(参见:AlarmManagerService#AlarmThread申请的wakelock), 这样能保证电话休眠时也能处理Alarm发出的PendingIntent指定的广播。一旦alarm receiver的onReceive() 方法执行完,wake lock会迅速被释放。如果在receiver中开启一个service,有可能service还没启动,wake lock已经被释放了, 所以此时要实现单独的wake lock策略。

    有4种Alarm类型: 
    1)RTC_WAKEUP 
    在指定的时刻(设置Alarm的时候),唤醒设备来触发Intent。

    2)RTC 

    在一个显式的时间触发Intent,但不唤醒设备。  

    3)ELAPSED_REALTIME 
    从设备启动后,如果流逝的时间达到总时间,那么触发Intent,但不唤醒设备。流逝的时间包括设备睡眠的任何时间。注意一点的是,时间流逝的计算点是自从它最后一次启动算起。   

    4)ELAPSED_REALTIME_WAKEUP 
    从设备启动后,达到流逝的总时间后,如果需要将唤醒设备并触发Intent。 

  • 相关阅读:
    打印九九乘法表
    PAT (Basic Level) Practice (中文) 1091 N-自守数 (15分)
    PAT (Basic Level) Practice (中文)1090 危险品装箱 (25分) (单身狗进阶版 使用map+ vector+数组标记)
    PAT (Basic Level) Practice (中文) 1088 三人行 (20分)
    PAT (Basic Level) Practice (中文) 1087 有多少不同的值 (20分)
    PAT (Basic Level) Practice (中文)1086 就不告诉你 (15分)
    PAT (Basic Level) Practice (中文) 1085 PAT单位排行 (25分) (map搜索+set排序+并列进行排行)
    PAT (Basic Level) Practice (中文) 1083 是否存在相等的差 (20分)
    PAT (Basic Level) Practice (中文) 1082 射击比赛 (20分)
    PAT (Basic Level) Practice (中文) 1081 检查密码 (15分)
  • 原文地址:https://www.cnblogs.com/wytiger/p/5745251.html
Copyright © 2011-2022 走看看