2013-10-11 53 views
0

我的應用程序執行以下代碼:到AlarmManager.setRepeating()第二呼叫會在錯誤的時間交付

// Check intakes every 15 minutes 
Intent i = new Intent(this, IntakeReceiver.class); 
i.putExtra("TYPE", "TAKEIN_CHECK"); 
PendingIntent pi = PendingIntent.getBroadcast(getApplicationContext(), 0, i, 0); 

AlarmManager am = (AlarmManager)(this.getSystemService(Context.ALARM_SERVICE)); 
Calendar cal = Calendar.getInstance(); 
int offset = 1000 * 60 * 15; // 1000 * 60 * 15 (15 minutes) 
long nowLastRounded = cal.getTimeInMillis() - (cal.getTimeInMillis() % offset); 
am.setRepeating(AlarmManager.RTC_WAKEUP, nowLastRounded + offset, offset, pi); 

// Also set alarm for 11:50 every day to notify about low stock 
Intent i2 = new Intent(this, LowStockReceiver.class); 
i2.putExtra("TYPE", "STOCK_CHECK"); 
PendingIntent pi2 = PendingIntent.getBroadcast(getApplicationContext(), 1, i2, 0); 

long interval_day = AlarmManager.INTERVAL_DAY; 
long interval_hour = AlarmManager.INTERVAL_HOUR; 
int offset2 = 1000 * 60 * 60 * 11 + 1000 * 60 * 50; // 11:50 

final int tzOffset = TimeZone.getDefault().getOffset(System.currentTimeMillis()); 
offset2 -= tzOffset; 

nowLastRounded = cal.getTimeInMillis() - (cal.getTimeInMillis() % interval_day); 
am.setRepeating(AlarmManager.RTC_WAKEUP, nowLastRounded + offset2, interval_hour, pi2); 

的問題是,LowStockReceiver.onReceive()被稱爲每隔15分鐘(如IntakeReceiver.onReceive()),但它僅應從11:50開始每小時調用一次。

我檢查了nowLastRounded + offset2的值,它等於當地時間今天11:50轉換爲GMT。所以它應該在11:50,12:50,13:50等運行(僅用於當前的測試目的)。

任何人都知道我可能做錯了什麼?

謝謝!

回答

0

解決了我自己的問題。

的問題是雙重的,但問題並沒有包含足夠細節的問題是可以解決的:

  • 上面的代碼被稱爲主應用程序類的靜態函數可以實例化由第一次報警。

  • 這導致第二次報警被重新安排,時間似乎已經過去,導致它立即被解僱並令我困惑。

0

對於兩個alarm.use使用不同的id,您使用相同的id作爲掛起的intent。

+0

我正在使用ID 0和ID 1我不是嗎? 或者你不是在談論requestCode? – profoX