将服务与 AlarmManager 和日历一起用于 运行 每个特定时间的任务不起作用

Using a Service with AlarmManager and Calendar to run task every specific hours doesn't work

我正在尝试编写代码来 运行 每天在特定时间执行任务。

我有一个包含整数的 hours 数组,我循环遍历它以设置从那个小时开始重复的闹钟,并以一天为间隔。

如果我只是每 10 秒创建一次服务和 运行 任务,或者它会执行 运行 AlarmReciever 但此代码在添加 Calendar API,我做错了什么?

    AlarmManager alarmManager;
    Calendar current = new GregorianCalendar();
    Calendar calendar = new GregorianCalendar();
    int[] hours = new int[] {14, 18, 21, 22};

    public int onStartCommand(Intent intent, int flags, int startId) {
        current.setTimeInMillis(System.currentTimeMillis());

        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent1 = new Intent(this, AlarmReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0);
        for (int hour : hours) {
            calendar.add(Calendar.DAY_OF_YEAR, current.get(Calendar.DAY_OF_YEAR));
            calendar.set(Calendar.HOUR_OF_DAY, hour);
            calendar.set(Calendar.MINUTE, 0);
            calendar.set(Calendar.SECOND, 0);
            calendar.set(Calendar.MILLISECOND, 0);
            calendar.set(Calendar.DATE, current.get(Calendar.DATE));
            calendar.set(Calendar.MONTH, current.get(Calendar.MONTH));
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
        }
        return START_STICKY;
    }

编辑:我尝试为每个循环打印出 calendar.getTimeInMillis(),这是输出

I/System.out: 2391249600000
I/System.out: 2643724800000
I/System.out: 2769962400000
I/System.out: 2833038000000

假设我取前两个数字:2643724800000 - 2391249600000 = 252475200000。252475200000 / 1000 = 252475200。252475200 / 60 = 4207920。 我很确定 4207920 分钟超过一个小时。为什么会这样?

好的,我找到了解决问题的方法。 首先感谢@MikeL 建议删除 calendar.add(Calendar.DAY_OF_YEAR, current.get(Calendar.DAY_OF_YEAR)); 因为这确实解决了一些问题,但即使在那之后它也没有用。

为了解决这个问题,我将 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent1, 0); 更改为 PendingIntent pendingIntent = PendingIntent.getBroadcast(this, hour, intent1, 0);

基本上将 0 更改为 hour,以便每个待处理的意图都不同。