0

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

// 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 转换为格林威治标准时间。所以它应该在 11:50、12:50、13:50 等运行(目前仅用于测试目的)。

有人知道我做错了什么吗?

谢谢!

4

2 回答 2

0

您对两个警报的待处理意图使用相同的 id。使用不同的 id。

于 2013-10-11T11:37:26.433 回答
0

解决了我自己的问题。

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

  • 上面的代码是作为主应用程序类的静态函数调用的,它可以被第一个警报实例化。

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

于 2013-10-18T15:51:51.800 回答