Android 6.0打盹模式下的闹铃pipe理器问题

我制作了一个应用程序,一直运行到Android 6.0。 我认为这是Dozefunction,它不允许我的闹钟触发。

我使用sharedpreferences来处理选项:

//ENABLE NIGHT MODE TIMER int sHour = blockerTimerPreferences.getInt("sHour", 00); int sMinute = blockerTimerPreferences.getInt("sMinute", 00); Calendar sTime = Calendar.getInstance(); sTime.set(Calendar.HOUR_OF_DAY, sHour); sTime.set(Calendar.MINUTE, sMinute); Intent enableTimer = new Intent(context, CallReceiver.class); enableTimer.putExtra("activate", true); PendingIntent startingTimer = PendingIntent.getBroadcast(context, 11002233, enableTimer, PendingIntent.FLAG_UPDATE_CURRENT); AlarmManager sAlarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); sAlarm.setRepeating(AlarmManager.RTC_WAKEUP, sTime.getTimeInMillis(), AlarmManager.INTERVAL_DAY, startingTimer); 

任何线索最新错误在这里?

这是一个阻止通话的应用程序。 谢谢!

编辑:我有3个文件(更多,但…)像:

 MainActivity (All code) CallReceiver (Broadcast that triggers the alarm again (reboot etc)) CallReceiverService (Handles the call / phone state) 

Solutions Collecting From Web of "Android 6.0打盹模式下的闹铃pipe理器问题"

打盹模式将延迟您的闹钟,直到下一个维护时间。 为了避免打盹模式阻止你的闹钟,你可以使用setAndAllowWhileIdle()setExactAndAllowWhileIdle()setExactAndAllowWhileIdle() setAlarmClock() 。 你将有大约10秒的时间来执行你的代码,并设置你的下一个警报(每15分钟不超过一次_AndAllowWhileIdle方法)

如果要testing打盹模式,可以使用ADB命令 :

  1. 使用Android 6.0(API级别23)或更高级别的系统映像configuration硬件设备或虚拟设备。

  2. 将设备连接到您的开发机器并安装您的应用程序。

  3. 运行您的应用程序并保持活动状态。
  4. closures设备屏幕。 (应用程序保持活动状态。)通过运行以下命令,强制系统在打盹模式中循环:

    adb shell dumpsys battery unplug

    adb shell dumpsys deviceidle step

  5. 您可能需要多次运行第二个命令。 重复它,直到设备状态变为空闲。

  6. 重新激活设备后,请注意您的应用程序的行为。 确保应用程序在设备退出打盹时正常恢复。

编辑:添加setAlarmClock示例

不要忘记检查SDK级别( Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP

 AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); Intent intent = new Intent(this, MyAlarmReceiver.class); //or just new Intent() for implicit intent //set action to know this come from the alarm clock intent.setAction("from.alarm.clock"); PendingIntent pi = PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); //Alarm fire in 5s. am.setAlarmClock(new AlarmManager.AlarmClockInfo(System.currentTimeMillis() + 5000, pi), pi); 

如果设备处于睡眠模式,则需要使用以下API之一: setExactAndAllowWhileIdle或setAndAllowWhileIdle 。

请注意,在hibernate模式下,没有用于唤醒重复闹钟的设备的API,所以如果您在hibernate时需要重复闹钟来唤醒设备,则必须使用上述API并在每次重新设置计时器定时器发射的发生。