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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/su749520/article/details/81949978

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=0x1
2018-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=015349368659742018-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=15349368659742018-08-22 19:21:05.974唤醒) win=0 tElapsed=1262624 maxElapsed=1262624 interval=0 flags=0x9
2018-08-22 19:21:05.974 934-1067/? V/AlarmManager: Checking for alarms... rtc=1534936865974, elapsed=1262624
// 准时唤醒,误差1ms
2018-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);
        }
    }

猜你喜欢

转载自blog.csdn.net/su749520/article/details/81949978