Java 由报警管理器触发的未决意图似乎会立即触发

Java 由报警管理器触发的未决意图似乎会立即触发,java,android,android-intent,Java,Android,Android Intent,我已经设置了一个报警管理器,它应该在一天中的某个时间触发一个未决的意图 我将代码放在我主要活动的onCreate()方法中,因为我认为这是放置代码的最佳位置 代码如下: Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 4); // trigger at 4am in the morning calendar.set(Calendar.MINUTE, 0);

我已经设置了一个报警管理器,它应该在一天中的某个时间触发一个未决的意图

我将代码放在我主要活动的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)
Alarm Manager可以工作,我可以看到它在指定的时间启动,但它似乎也会在这个基础应用启动后立即启动挂起的意图


是什么导致了立即开火的意图?我怎样才能阻止它这样做呢?

您将闹钟设置为今天凌晨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()将返回当前时间戳之前的时间戳(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
}


首先,检查您设置的
报警是否按预期添加到“命令行”中粘贴此
adb shell dumpsys Alarm>alarms.txt
。并在alarms.txt中搜索包名。您应该在+8h42m36s649ms repeatInterval=10800000 count=1 operation=PendingEvent{41c6e8b8:PendingEntRecord{41e7e768 your.package.name广播意向}时找到类似于
RTC#U WAKEUP#13:Alarm{41e7daf8 type 0 your.package.name}type=0的内容。如果你将手机闹钟设置为早上8点,就在你睡觉之前,它会马上响吗?因为早上8点已经过去了?不,它不会。calendar.getInstance()返回当前日期和时间。当您将时间更改为凌晨4点时,您更改的是时间,而不是日期。系统报警应用程序也会更改日期(如果时间已经过去,它会自动设置明天)。@StenSoft是对的,所以我正在向上投票以抵消不合理的向下投票。3秒钟的延迟是为了什么?它仅用于案例日历。getTimeInMillis()与系统非常接近。currentTimeMillis()是所以你不想马上开始报警。对吗?
calendar.add(Calendar.DATE, 1); // Add 1 day --> Calendar time will be tomorrow 4am
alarm.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pIntent);