【问题标题】:AlarmManager doesn't trigger to my serviceAlarmManager 不会触发我的服务
【发布时间】:2026-01-28 19:15:02
【问题描述】:

我将 AlarmManager 设置如下:

Intent startIntent =  new Intent(context, MyService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, 0, startIntent, 0);
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3000, pendingIntent);
Log.d(TAG, "Current time is " + System.currentTimeMillis());
Log.d(TAG, "Next alarm time is: " + (alarmManager.getNextAlarmClock().getTriggerTime() - System.currentTimeMillis()));

它显示
当前时间是1499909678520
下次报警时间为:55521479

我认为 RTC 是使用 System.currentTimeMillis() 的 UTC 时间。下一个警报应该是小于 3000 的数字吗?

仅供参考,在我的服务中,我会这样处理:

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
  Log.i(TAG, "MyService started");
}

我的服务永远不会启动。怎么了?

【问题讨论】:

  • getNetAlarmClock() 返回预定的下一个闹钟。我无法从您发布的代码中看出您是否安排了任何(developer.android.com/reference/android/app/…)。 alarmManager.set() 创建一个意图广播。您将需要一个广播接收器来接收待处理的意图并对其采取行动(developer.android.com/reference/android/app/…, long, android.app.PendingIntent))。请注意 警报是一个 Intent 广播,它会发送到您注册的广播接收器

标签: java android service alarmmanager utc


【解决方案1】:

重复报警使用:

// Alarm time :: Current time
Calendar calendar = Calendar.getInstance() ;
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.SECOND, 0);

// Interval
long interval = 3000; // 3 seconds

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), interval, pendingIntent);

代替:

alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 3000, pendingIntent);

确保您在AndroidManifest.xml 中声明了MyService

【讨论】:

  • 我的服务是用 android:exported="false" 声明的。我想设置一次性闹钟,而不是重复闹钟。
  • 哦...对于单个警报,我认为您的代码看起来不错
【解决方案2】:

我在显示日志时犯了一个愚蠢的错误。所以,我的代码确实有效。但是,我猜 alarmManager.getNextAlarmClock().getTriggerTime() 不会在 UTC 中返回,这会导致 System.currentTimeMills() 的差异。

【讨论】: