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

mob*_*bob 13 android alarmmanager android-pendingintent android-appwidget

我正在按照示例代码每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);
Run Code Online (Sandbox Code Playgroud)

Fal*_*rri 23

AlarmManager.setRepeating定义为public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation)第二个参数是应该首次调用它.你告诉它从SystemClock.elapsedRealtime()现在开始.


Com*_*are 16

你告诉setRepeating()你要立即关闭第一个警报(SystemClock.elapsedRealtime()).如果您希望第一个警报在其他时间关闭,请添加偏移量(SystemClock.elapsedRealtime()+nextUpdate).


Shr*_*hat 6

如果您要为过去的时间创建警报的PendingIntent,它将立即被触发.示例 - 为今天上午8点安排警报,但在上午11点左右执行代码将立即触发.

解:

cal.add(Calendar.DATE, 1);

long delay = 24 * 60 * 60 * 1000;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 
Run Code Online (Sandbox Code Playgroud)

这将在第二天的特定时间(即早上8点)发射事件;