2015-07-22 178 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(),然後在觸發後註冊新的警報。 –