BroadcastReceiver会延迟发射

时间:2016-12-06 16:26:22

标签: android broadcastreceiver alarmmanager android-alarms

我有TimePickerButton,我想在用户在指定时间点击Button时设置闹钟。

当我点击按钮但是有时在指定时间发出警报时,它会得到很好的时间,但并非总是如此。它在指定时间点燃的次数少于未点火时间。大多数情况下BroadcastReceiver在指定时间不会发射,它会延迟发射。

这是我现在的代码:

On Alarm类(代码参考BroadcastReceiver)

AlarmManager alarm = (AlarmManager) getSystemService(ALARM_SERVICE);
Intent intent = new Intent(getApplicationContext(), AlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(getApplicationContext(), 0, intent, 0);

Calendar cal= Calendar.getInstance();

cal.set(Calendar.MONTH,cal.get(Calendar.MONTH));
cal.set(Calendar.YEAR,cal.get(Calendar.YEAR));
cal.set(Calendar.DAY_OF_MONTH,cal.get(Calendar.DATE));
cal.set(Calendar.HOUR_OF_DAY,hour);
cal.set(Calendar.MINUTE,minutes);


alarm.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), 1000 * 60 * 5, alarmIntent);

其中hourminutes是从TimePicker检索的小时和分钟。

在AlarmReceiver类

public class AlarmReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.d("prove", "We enter on BroadcastReceiver");
    }
}

在Manifest.xml上

<receiver
    android:name=".AlarmReceiver"
    android:enabled="true" >
</receiver>

例如,在显示TimePicker的日志之前,我已经放置了一个日志,以查看我从BroadcastReceiver检索的小时数。我点击了16:48(在TimePicker上),这就是结果:

12-06 16:47:02.951 7980-7980/com.project.user.project D/prove: hour: 16:48
12-06 16:50:23.727 7980-7980/com.project.user.project D/prove: We enter on BroadcastReceiver
12-06 17:00:01.070 7980-7980/com.project.user.project D/prove: We enter on BroadcastReceiver

正如您所看到的,BroadcastReceiver已在16:5017:00被解雇两次,我认为它们应该在16:4816:53时触发因为我已经确定它们之间会延迟5分钟,而不是像这种情况那样10分钟。

那么,我该怎么做才能在准确的时间发出警报而不是延迟发射?我错过了一些配置吗?

提前致谢!

2 个答案:

答案 0 :(得分:1)

如上所述in the documentationsetRepeating不准确。

  

从API 19开始,所有重复警报都不准确。如果你的申请   需要精确的交货时间然后它必须使用一次性精确报警,   如上所述每次重新安排。遗留应用程序   targetSdkVersion早于API 19将继续拥有全部   他们的警报,包括重复警报,视为准确

因此,要在API 19的确切时间触发警报,请使用setExact,并在每个警报内设置下一个警报。

  

安排在规定时间准确交付警报。

答案 1 :(得分:0)

使用 setInexactRepeating

alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 1000 * 60 * 5, alarmIntent);

你可以查看我的代码我在app中做了什么。我工作得很完美。

pendingIntent = PendingIntent.getBroadcast(this, _id, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeToAlarm, AlarmManager.INTERVAL_DAY, pendingIntent);

愿它有所帮助......