我正在按照示例代码每10秒发送一次更新通知。代码如下,UpdateService
位于AppWidgetProvider
。如果我放一个Thread.sleep(10*1000);
我可以看到我的服务循环的预期行为。我显然有一些根本错误的东西会立即触发。它应该是警报的PendingIntent
,它会向我的听众广播更新。
long nextUpdate = 10*1000;
Log.d(TAG, "Requesting next update in " + nextUpdate + " msec." );
Intent updateIntent = new Intent(ACTION_UPDATE_ALL);
updateIntent.setClass(this, UpdateService.class);
PendingIntent pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0);
// Schedule alarm, and force the device awake for this update
AlarmManager alarmManager = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(),
nextUpdate, pendingIntent);
答案 0 :(得分:23)
AlarmManager.setRepeating定义为public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)
第二个参数是应该首次调用它。你告诉它从SystemClock.elapsedRealtime()
开始,现在是。
答案 1 :(得分:16)
您告诉setRepeating()
您希望第一个闹钟立即响起(SystemClock.elapsedRealtime()
)。如果您希望第一个警报在其他时间消失,请添加偏移量(SystemClock.elapsedRealtime()+nextUpdate
)。
答案 2 :(得分:6)
如果您要在过去一段时间内创建警报的PendingIntent,则会立即触发。示例 - 为今天上午8点安排警报,但在上午11点左右执行代码将立即触发。
解决方案:
cal.add(Calendar.DATE, 1);
long delay = 24 * 60 * 60 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);`
这将在第二天的指定时间(即上午8点)发射事件;