报警管理器INTERVAL_DAY无法正常工作

时间:2016-03-12 23:39:28

标签: android alarmmanager background-service

我希望每天早上8点运行一些代码。 我在MainActivity中的onCreate中有这段代码

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 8);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);

    Intent intent = new Intent(this, PriceAmountService.class);
    PendingIntent pintent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pintent);

但每次app启动时都会运行该作业。 我的代码是好还是错?此代码是否在正确的位置(onCreate)?我做错了什么?

我的min API是14

2 个答案:

答案 0 :(得分:6)

感谢Doug Stevenson,我通过向我的方法添加简单的if来解决这个问题。 我在上午8:00完成工作的方法是:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, 8);
    cal.set(Calendar.MINUTE, 0);
    cal.set(Calendar.SECOND, 0);

    if (Calendar.getInstance().after(cal)) {
        cal.add(Calendar.DAY_OF_MONTH, 1);
    }

    Intent intent = new Intent(this, PriceAmountService.class);
    PendingIntent pintent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

    AlarmManager alarm = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    alarm.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pintent);

答案 1 :(得分:3)

此代码告诉AlarmManager第一个警报应该是在该代码运行的当天的同一天上午8点。如果你在任何一天的 8am之后运行这个特定的代码,那么第一个上午8点就会发生,并且AlarmManager可能会选择立即运行它,因为它错过了第一次出现并将尝试弥补它。如果您希望第一个闹钟是下一个天的晚上8点,则必须在日历中添加一天,然后再添加一天。