如何设置闹钟每天重复3次?
我想设置一个警报,以检查服务器是否在每天上午7点,上午12点和下午10点获取新数据。
我试着这样说:如何设置闹钟每天重复3次?
public void startAlarm(Context context) {
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, ShowNotificationReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar firstTurn = Calendar.getInstance();
Calendar secondTurn = Calendar.getInstance();
Calendar thirdTurn = Calendar.getInstance();
// set times
firstTurn.set(Calendar.HOUR_OF_DAY,FIRST_TURN_HOUR);
firstTurn.set(Calendar.MINUTE,FIRST_TURN_MINUTE);
secondTurn.set(Calendar.HOUR_OF_DAY,SECOND_TURN_HOUR);
secondTurn.set(Calendar.MINUTE,SECOND_TURN_MINUTE);
thirdTurn.set(Calendar.HOUR_OF_DAY,THIRD_TURN_HOUR);
thirdTurn.set(Calendar.MINUTE,THIRD_TURN_MINUTE);
alarmMgr.cancel(alarmIntent);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstTurn.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, secondTurn.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, thirdTurn.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
}
如果我在时间的正常工作和消防评论2的最后一行,但它不工作,如果我想所有的人。
我的错误在哪里,我该如何解决这个问题?
一些搜索后,玩更多的代码我解决我这样的问题:
public void startAlarm(Context context) {
AlarmManager alarmMgr = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, ShowNotificationReceiver.class);
Calendar firstTurn = Calendar.getInstance();
Calendar secondTurn = Calendar.getInstance();
Calendar thirdTurn = Calendar.getInstance();
// set times
firstTurn.set(Calendar.HOUR_OF_DAY, FIRST_TURN_HOUR);
firstTurn.set(Calendar.MINUTE, FIRST_TURN_MINUTE);
PendingIntent alarmIntent = PendingIntent.getBroadcast(context, REQUEST_CODE, intent, PendingIntent.FLAG_CANCEL_CURRENT);
secondTurn.set(Calendar.HOUR_OF_DAY, SECOND_TURN_HOUR);
secondTurn.set(Calendar.MINUTE, SECOND_TURN_MINUTE);
PendingIntent alarmIntent2 = PendingIntent.getBroadcast(context, REQUEST_CODE2, intent, PendingIntent.FLAG_CANCEL_CURRENT);
thirdTurn.set(Calendar.HOUR_OF_DAY, THIRD_TURN_HOUR);
thirdTurn.set(Calendar.MINUTE, THIRD_TURN_MINUTE);
PendingIntent alarmIntent3 = PendingIntent.getBroadcast(context, REQUEST_CODE3, intent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmMgr.cancel(alarmIntent);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, firstTurn.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, secondTurn.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent2);
alarmMgr.setInexactRepeating(AlarmManager.RTC_WAKEUP, thirdTurn.getTimeInMillis(), AlarmManager.INTERVAL_DAY, alarmIntent3);
}
如果要设置多个闹钟(重复或单)解释说,那么你只需要用不同的requestCode创建他们的PendingIntents。 如果requestCode是相同的,那么新的警报将覆盖旧的 之一。
尝试为您的方法创建3个不同的AlarmManager
对象。此外,您可以改为在另一个闹钟结束后触发每个闹钟,在您的BroadcastReceiver
您无法创建AlarmManager。你从context.getSystemService(Context.ALARM_SERVICE)获得的实例是一个单例。 –
如果您只是想让它每天重复三次,您可以注册它以便每8小时触发一次(因为24小时除以8是3)。
alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTurn.getTimeInMillis(), AlarmMAnager.INTERVAL_HOUR * 8, alarmIntent);
你的代码是不工作的原因是因为setInexactRepeating任何调用将取消具有相同的PendingIntent任何先前的呼叫。从documentation:
如果已经有安排在同IntentSender报警时,它会首先被取消。
如果您希望每天执行三次操作,但不是每隔8小时执行一次操作,则可以使用AlarmManager.setExact()在第一次转动时触发一个警报(即无需重复)。一旦触发了该警报(即,在接收器中调用了onReceive()),您只需在第二轮中调用AlarmManager.setExact(),依此类推。
感谢您的回答,我想要准确的时间,我找到了解释的想法 –
您应该知道,AlarmManager不会确切的时间,并且自API级别19以来的所有重复警报都不准确。即使在19岁以下的API级别,也不保证在您设置的确切时间内收到。 如果您想确保获得准确的时间,您需要使用AlarmManager.setExact(),然后在触发后注册新的警报。 –
为什么必须在特定的时间开除?您可以将闹铃设置为每8小时触发一次,相当于每天3次 –
我想说,使用相同的未决意图会导致它“覆盖”之前的设置;但我找不到支持该ATM的文档。我会尝试创建新的等待意图w /不同的'REQUEST_CODE'值,看看是否有效。 – Nija
此时用户看到此消息很重要,那些时间我说的是示例,可能将来会更改 –