第二次调用AlarmManager.setRepeating()会在错误的时间传递

时间:2013-10-11 11:29:13

标签: java android alarmmanager

我的应用程序执行以下代码:

// 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等运行(目前仅用于测试目的)。

任何人都知道我可能做错了什么?

谢谢!

2 个答案:

答案 0 :(得分:0)

您使用相同的ID来表示alarm.use不同的id。

答案 1 :(得分:0)

解决了我自己的问题。

问题是双重的,但问题没有包含足够的细节来解决这个问题:

  • 上面的代码被称为主Application类的静态函数,可以通过第一个警报实例化。

  • 这导致第二次警报被重新安排,时间似乎已经过去,导致它立即被解雇并使我感到困惑。