在我的应用程序中,我将使用警报通知用户事件,问题是 在Android版本6.x-上 警报在确切时间的相同分钟后发出 这仅在设备进入睡眠模式时。
我试图在闹钟之前唤醒设备,但无济于事。
任何人都可以帮助我吗?这是我的代码
设置闹钟
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);
if (minutesBefore > 0) {
beforeCalendar.add(Calendar.MINUTE, -minutesBefore);
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, beforeCalendar.getTimeInMillis(), beforePendingIntent);
}
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);
if (minutesBefore > 0) {
beforeCalendar.add(Calendar.MINUTE, -minutesBefore);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, beforeCalendar.getTimeInMillis(), beforePendingIntent);
}
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, alarmCalendar.getTimeInMillis(), pendingIntent);
if (minutesBefore > 0) {
beforeCalendar.add(Calendar.MINUTE, -minutesBefore);
alarmManager.set(AlarmManager.RTC_WAKEUP, beforeCalendar.getTimeInMillis(), beforePendingIntent);
}
}
弱锁定
当我收到broadcastreceiver的警报时,我试着唤醒设备 来自此代码的打盹模式
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
//Object flags;
wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Alarm_WakeLock");
wl.acquire();
但警报仍在同一分钟后发出!!
答案 0 :(得分:1)
当电话未使用一段时间时,实施打盹模式以节省电池电量。它通过延迟像AlarmManager这样的操作来实现。
如果您确实需要在准确时间内触发警报,请使用[setExactAndAllowWhileIdle()
](https://developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int,long,android.app.PendingIntent))。
docs说:
如果您需要设置在Doze中触发的警报,请使用setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。
答案 1 :(得分:0)
从docs开始,看起来setExactAndAllowWhileIdle即使在打瞌睡期间也会触发,所以这对你有用,但你可以试试setAlarmClock。
使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。
所以你可以使用它。但它旨在用于用户认为的闹钟 - 手机将提醒用户的预定时间(而不仅仅是日历事件)。图标甚至在状态栏中显示为物理闹钟面,许多锁屏也会通知用户下一次警报的安排时间。
REF https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/