版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/su749520/article/details/81949978
1. 模拟进入 Doze 模式
- 设置未充电状态
adb shell dumpsys battery unplug
- 设置强制进入深度deep模块
adb shell dumpsys deviceidle force-idle deep
- 设置开启 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=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=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);
}
}