为什么我的android报警管理器会立即触发?

时间:2010-07-29 02:06:44

标签: android alarmmanager android-appwidget android-pendingintent

我正在按照示例代码每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);

3 个答案:

答案 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点)发射事件;