由 Alarm Manager 触发的 Pending Intent 似乎会立即触发

Pending Intent triggered by Alarm Manager seems to fire right away

我已经设置了一个警报管理器,它应该在一天中的特定时间触发一个待处理的 Intent。

我将代码放在 Main Activity 的 onCreate() 方法中,因为我认为这是放置它的最佳位置?

代码如下:

    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);

    final Intent updateIntent = new Intent(Intent.ACTION_MAIN, null);
    updateIntent.addCategory(Intent.CATEGORY_HOME);
    final ComponentName cn = new ComponentName(
            "com.example.myotherapp",
            "com.example.myotherapp.MainActivity");
    updateIntent.setComponent(cn);
    updateIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(), 0, updateIntent, 0);

    AlarmManager alarm = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
    alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent); // launch at 4am, then every day (24 hours)

警报管理器有效,我可以看到它在指定的时间触发,但似乎只要这个基础应用程序启动就会触发 Pending Intent。

是什么导致 Intent 立即触发?我怎样才能阻止它这样做?

您将闹钟设置为今天凌晨 4 点触发,而不是明天。因为那个时间已经过去了,警报会立即触发。

你的问题在这里:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);

calendar.getTimeInMillis() 将 return 当前时间戳 (System.currentTimeMillis()) 之前的时间戳,这就是警报立即触发的原因。

解决您的问题:

long triggerTime = calendar.getTimeInMillis();
if (triggerTime  <= System.currentTimeMillis() + 3000) 
{
    // 3 Second distance

   calendar.add(Calendar.DATE, 1);  // Add 1 day --> Trigger 1 day later from now
}

如果您总是想在 1 天后的凌晨 4 点启动闹钟。您可以删除条件并这样做:

calendar.add(Calendar.DATE, 1); // Add 1 day --> Calendar time will be tomorrow 4am

alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent);