2015-07-22 634 views
0

我想设置一个警报,以检查服务器是否在每天上午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的最后一行,但它不工作,如果我想所有的人。
我的错误在哪里,我该如何解决这个问题?

+0

为什么必须在特定的时间开除?您可以将闹铃设置为每8小时触发一次,相当于每天3次 –

+0

我想说,使用相同的未决意图会导致它“覆盖”之前的设置;但我找不到支持该ATM的文档。我会尝试创建新的等待意图w /不同的'REQUEST_CODE'值,看看是否有效。 – Nija

+0

此时用户看到此消息很重要,那些时间我说的是示例,可能将来会更改 –

回答

1

一些搜索后,玩更多的代码我解决我这样的问题:

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); 
    } 

正如this answer

如果要设置多个闹钟(重复或单)解释说,那么你只需要用不同的requestCode创建他们的PendingIntents。 如果requestCode是相同的,那么新的警报将覆盖旧的 之一。

0

尝试为您的方法创建3个不同的AlarmManager对象。此外,您可以改为在另一个闹钟结束后触发每个闹钟,在您的BroadcastReceiver

+2

您无法创建AlarmManager。你从context.getSystemService(Context.ALARM_SERVICE)获得的实例是一个单例。 –

1

如果您只是想让它每天重复三次,您可以注册它以便每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(),依此类推。

+1

感谢您的回答,我想要准确的时间,我找到了解释的想法 –

+0

您应该知道,AlarmManager不会确切的时间,并且自API级别19以来的所有重复警报都不准确。即使在19岁以下的API级别,也不保证在您设置的确切时间内收到。 如果您想确保获得准确的时间,您需要使用AlarmManager.setExact(),然后在触发后注册新的警报。 –