Android 广播接收机延迟发射
我有一个Android 广播接收机延迟发射,android,broadcastreceiver,alarmmanager,android-alarms,Android,Broadcastreceiver,Alarmmanager,Android Alarms,我有一个计时器和一个按钮,我想在用户在指定时间单击按钮时设置一个警报 当我点击按钮时,它可以很好地得到小时数,但有时会在指定的时间触发警报,但并不总是。在指定时间激发的次数少于未激发的次数。大多数情况下,BroadcastReceiver没有在指定时间触发,它会延迟触发 这是我现在拥有的代码: 报警等级(代码参考广播接收器) 其中hour和minutes是从TimePicker检索到的小时和分钟 在AlarmReceiver类上 public class AlarmReceiver extend
计时器
和一个按钮
,我想在用户在指定时间单击按钮时设置一个警报
当我点击按钮时,它可以很好地得到小时数,但有时会在指定的时间触发警报,但并不总是。在指定时间激发的次数少于未激发的次数。大多数情况下,BroadcastReceiver
没有在指定时间触发,它会延迟触发
这是我现在拥有的代码:
报警等级(代码参考广播接收器)
其中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>
如您所见,BroadcastReceiver
已经在16:50
和17:00
发射了两次,我认为它们应该在16:48
和16:53
发射,因为我已经设置了它们之间的延迟时间为5分钟,而不是本例中的10分钟
那么,我该怎么做才能在准确的时间发出警报,而不是延迟发出警报呢?我是否缺少一些配置
提前谢谢 使用设置不精确重复
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 1000 * 60 * 5, alarmIntent);
你可以检查我的代码我在我的应用程序中做了什么。我工作得很好
pendingIntent = PendingIntent.getBroadcast(this, _id, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeToAlarm, AlarmManager.INTERVAL_DAY, pendingIntent);
如前所述,setRepeating
是不精确的
从API 19开始,所有重复报警都是不精确的。如果你的申请
需要精确的交付时间,则必须使用一次性精确警报,
按上述每次重新安排。遗留应用程序
targetSdkVersion早于API 19,将继续具有所有
他们的警报,包括重复警报,被视为精确警报
因此,要在API 19的准确时间触发警报,请使用,并在每个警报内设置下一个警报
计划在规定时间准确发出警报
如果有任何其他疑问,请告诉我,但我需要警报将在指定的时间准确。在文档中,long,long,android.app.pendingent)写道:计划一个重复警报,该警报具有不精确的触发时间要求;例如,一个每小时重复一次的警报,但不一定在每小时的顶部。
我有一个问题,如果我有一个警报在准确的时间重复两到三次。例如,在16:48
、16:50
和16:52
。我是否应该添加三个调用setExact
函数的事件?如果您想将警报设置为3组,并且它们没有特定的模式,那么我认为您应该使用setExact
三次,是的。否则,如果您希望警报每2分钟触发一次(例如),则只需使用一次setExact
,然后在接收器中重新安排,如上所述。是的,它们将具有特定的模式,例如每2分钟一次。但我不明白他们说的reschedule
setExact
只安排一次闹钟是什么意思。因为你需要你的闹钟重复,你需要在你的onReceive
内调用setExact
,下一个闹钟的时间,这就是重新安排的意思。所以reschedule
意味着每次都要重新呼叫广播接收器?
alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(), 1000 * 60 * 5, alarmIntent);
pendingIntent = PendingIntent.getBroadcast(this, _id, myIntent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeToAlarm, AlarmManager.INTERVAL_DAY, pendingIntent);