【问题标题】:Repeat alarm not working at exact 15 minutes interval in android重复警报在 android 中无法以 15 分钟的准确间隔工作
【发布时间】:2017-04-06 13:21:40
【问题描述】:

您好,我已经根据确切的警报以 15 分钟的间隔创建了一个警报,我正在创建一个重复 15 分钟的警报,但重复的警报不能正常工作。

//计算精确的 15 分钟间隔

public static long calculateInterval() {
        Calendar calendar = Calendar.getInstance();
        int m = calendar.get(Calendar.MINUTE);
        Calendar alarm = Calendar.getInstance();
        alarm.set(Calendar.HOUR_OF_DAY, Integer.parseInt(getCurrentTimeIn24Hrs().split(":")[0]));
        alarm.set(Calendar.MINUTE, Integer.parseInt(getCurrentTimeIn24Hrs().split(":")[1]));
        alarm.set(Calendar.SECOND, 0);
        alarm.set(Calendar.MILLISECOND, 0);
        long start = alarm.getTimeInMillis();
        long remain = 0;
        if (m < 15) {
            remain = 15 - m;
        } else if (m < 30) {
            remain = 30 - m;
        } else if (m < 45) {
            remain = 45 - m;
        } else {
            remain = 60 - m;
        }
        remain = start + remain * 60 * 1000;
        return remain;
    }

public void setAlarm() {
        Log.i("Service++++", "Alarm set");
        Intent myIntent = new Intent(mContext, SetAlarm.class);
        AlarmManager am = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 1234, myIntent, 0);
        int ALARM_TYPE = AlarmManager.RTC;
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
            am.setExact(ALARM_TYPE, Utility.calculateInterval(), pendingIntent);
        else
            am.set(ALARM_TYPE, Utility.calculateInterval(), pendingIntent);
    }

//重复报警

public void setRepeatingAlarm() {
        Intent alarmIntent = new Intent(mContext, UpdateServiceAlarm.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 1236, alarmIntent, 0);
        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(System.currentTimeMillis());
        calendar.add(Calendar.SECOND, 0);
        calendar.add(Calendar.MILLISECOND, 0);
        alarmManager.setInexactRepeating(AlarmManager.RTC, calendar.getTimeInMillis(), AlarmManager.INTERVAL_FIFTEEN_MINUTES, pendingIntent);
    }

【问题讨论】:

  • 没有让你正确。在一个每隔 15 分钟定期触发的警报中,您正在设置另一个同样以 15 分钟间隔重复的警报?
  • @Radhey 第一个警报我正在计算下一个准确的 15 分钟,基于我每 15 分钟间隔创建重复警报
  • 你为什么要这样计算#exact 15 min!只需按照毫秒设置 15 分钟间隔。就是这样。在完成第一个定期警报的 15 分钟后,这也会更新您创建的第二个警报。
  • 在 15 分钟内不应发出警报,例如 10:00、10:15、10:30 等,
  • 第一次报警没有问题。重复报警是问题

标签: android alarmmanager android-alarms


【解决方案1】:

您设置了不准确的警报。根据documentation

注意:从 API 19 (KITKAT) 开始,警报传递是不精确的:操作系统将切换警报以最大程度地减少唤醒和电池使用。有新的 API 来支持需要严格交付保证的应用程序;参见 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。 targetSdkVersion 早于 API 19 的应用程序将继续看到以前的行为,即所有警报都在请求时准确传递。

因此,将alarmManager.setExact() 用作您的第一个闹钟,并每 15 分钟重新启动一次。

【讨论】:

  • alarmManager.setExact() 这将每 15 分钟自动重复一次,还是我需要重新开始?
  • @Shan 没有。你从警报中捕捉到意图并重新启动它(每 15 分钟)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 2020-02-22
  • 1970-01-01
相关资源
最近更新 更多