我有TimePicker
和Button
,我想在用户在指定时间点击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);
其中hour
和minutes
是从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:50
和17:00
被解雇两次,我认为它们应该在16:48
和16:53
时触发因为我已经确定它们之间会延迟5分钟,而不是像这种情况那样10分钟。
那么,我该怎么做才能在准确的时间发出警报而不是延迟发射?我错过了一些配置吗?
提前致谢!
答案 0 :(得分:1)
如上所述in the documentation,setRepeating
不准确。
从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);
愿它有所帮助......