博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Doze模式下的 IDLE Alarm唤醒延迟现象
阅读量:4147 次
发布时间:2019-05-25

本文共 2461 字,大约阅读时间需要 8 分钟。

1. 模拟进入 Doze 模式

  1. 设置未充电状态
adb shell dumpsys battery unplug
  1. 设置强制进入深度deep模块
adb shell dumpsys deviceidle force-idle deep
  1. 设置开启 alarm 日志
adb shell dumpsys alarm log on

然后我们就可以连接USB,在logcat中动态查看日志行为。

2. Doze模式下的 IDLE Alarm唤醒延迟现象

日历界面设置了一个type=2 的闹钟,时间是19:06后,但是 idle 必发无法唤醒(现象复现)

只看到设置,没有看到触发

2018-08-22 19:04:28.710 934-1401/? V/AlarmManager: set(PendingIntent{
9a425b2: PendingIntentRecord{
80c7903 com.xxx.calendar broadcastIntent}}) : type=2 triggerAtTime=266359 win=0 tElapsed=270360 maxElapsed=266359 interval=0 flags=0x12018-08-22 19:04:28.712 934-1401/? V/AlarmManager: set(PendingIntent{
580a080: PendingIntentRecord{
80c7903 com.xxx.calendar broadcastIntent}}) : type=2 triggerAtTime=266361 win=0 tElapsed=270362 maxElapsed=266361 interval=0 flags=0x1

3. Doze模式下的正常的唤醒日志

设置一个 type=0 并1534936865974【2018-08-22 19:21:05.974】时刻 唤醒,日志准时唤醒,误差1ms

// 设置一个 type=0 并1534936865974【2018-08-22 19:21:05.974】时刻 唤醒,日志准时唤醒2018-08-22 19:17:05.975 934-1422/? V/AlarmManager: set(PendingIntent{
20d5a62: PendingIntentRecord{b0587f3 com.android.xxx.powersave startService}}) : type=0 triggerAtTime=1534936865974(2018-08-22 19:21:05.974唤醒) win=0 tElapsed=1262624 maxElapsed=1262624 interval=0 flags=0x92018-08-22 19:21:05.974 934-1067/? V/AlarmManager: Checking for alarms... rtc=1534936865974, elapsed=1262624// 准时唤醒,误差1ms2018-08-22 19:21:05.975 934-1067/? V/AlarmManager: Triggering alarm #0: Alarm{
72bd3ba type 0 when 1534936865974 com.android.xxx.powersave}2018-08-22 19:21:05.978 934-1067/? V/AlarmManager: sending alarm Alarm{
72bd3ba type 0 when 1534936865974 com.android.xxx.powersave}2018-08-22 19:21:05.978 934-1067/? D/AlarmManager: wakeup alarm = Alarm{
72bd3ba type 0 when 1534936865974 com.android.xxx.powersave}; package = com.android.xxx.powersave, needGrouping = false

正常定时器代码如下

public static void starAlarmTaskByService(Context context, int intervalMinute, Intent intent) {        AlarmManager mAlarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);        long triggerAtMillis = System.currentTimeMillis() + (intervalMinute * 60 * 1000);        PendingIntent operation = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {            mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);        } else {            mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerAtMillis, operation);        }    }

转载地址:http://zzjti.baihongyu.com/

你可能感兴趣的文章
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>
laravel 修改api返回默认的异常处理
查看>>
laravel事务
查看>>
【JavaScript 教程】浏览器—History 对象
查看>>
这才是学习Vite2的正确姿势!
查看>>
7 个适用于所有前端开发人员的很棒API,你需要了解一下
查看>>
25个构建Web项目的HTML建议,你需要了解一下!
查看>>
【web素材】02-10款大气的购物商城网站模板
查看>>
6种方式实现JavaScript数组扁平化(flat)方法的总结
查看>>
49个在工作中常用且容易遗忘的CSS样式清单整理
查看>>
20种在学习编程的同时也可以在线赚钱的方法
查看>>
隐藏搜索框:CSS 动画正反向序列
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(上)
查看>>
【视频教程】Javascript ES6 教程27—ES6 构建一个Promise
查看>>
【5分钟代码练习】01—导航栏鼠标悬停效果的实现
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(中)
查看>>
127个超级实用的JavaScript 代码片段,你千万要收藏好(下)
查看>>
【web素材】03-24款后台管理系统网站模板
查看>>