【问题标题】:AlarmManager with flag AlarmManager.INTERVAL_DAY is executing in the current day, not in the next day带有标志 AlarmManager.INTERVAL_DAY 的 AlarmManager 在当天执行,而不是在第二天执行
【发布时间】:2015-06-19 13:55:44
【问题描述】:

我需要在我的 Android 应用程序中添加推送通知。通知必须在每天的特定时间(例如下午 1 点)显示。为此,我正在使用 AlarmManager。当应用程序第一次启动时,我正在注册一个警报。但我有一个问题。 如果我正在将我的应用程序安装到设备上,例如在下午 1.10 点,那么警报会在我的应用程序启动后立即运行。但这是错误的,因为我需要在第二天而不是当天运行此警报。谁能帮助我并告诉我如何设置每日闹钟,该闹钟必须从当天开始工作。

这是我的代码,我现在正在使用它

private void registerAMAlarmManger(){
    mAMAlarmIntent = new Intent(this, AMAlarmReceiver.class);
    mAMPendingIntent = PendingIntent.getBroadcast(this, 0, mAMAlarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    SharedPreferences sPrefs = getSharedPreferences(Constants.PREFERENCES_NAME, Context.MODE_PRIVATE);
    int amTime = sPrefs.getInt(Constants.MORNING_TIME, 9);

    AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(System.currentTimeMillis());
    calendar.set(Calendar.HOUR_OF_DAY, amTime);
    calendar.set(Calendar.MINUTE, 0);

    am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, mAMPendingIntent);


}

【问题讨论】:

    标签: android push-notification alarmmanager android-alarms


    【解决方案1】:

    如果当前日期的时间已经过去,它会执行执行警报的代码。这需要处理。我按照以下方式进行

        Calendar calendar = Calendar.getInstance();
                            calendar.setTimeInMillis(System.currentTimeMillis());
                            calendar.set(Calendar.HOUR_OF_DAY, mytesthourofday);
                            calendar.set(Calendar.MINUTE,
                                    Integer.parseInt(min_am_pm[0]));
                            // calendar.set(Calendar.AM_PM, am_pm_integer);
                            calendar.set(Calendar.SECOND, 0);
                            calendar.set(Calendar.MILLISECOND, 0);
    
                            if (calendar.getTimeInMillis() < System.currentTimeMillis()) {
                                calendar.add(Calendar.DAY_OF_MONTH, 1);
                            }
    
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                                calendar.getTimeInMillis(), 1000 * 24 * 60 * 60,
                                pendingIntent);
    

    【讨论】:

    • 感谢您的回答。我想澄清一下这部分代码“if (calendar.getTimeInMillis()
    • 还有一个问题:calendar.setTimeInMillis(System.currentTimeMillis());这行代码有必要吗?因为在一些关于 AlarmManager 的教程中她不见了。
    • 是的,我加了一天..即下一天
    【解决方案2】:
    Calendar calendar = Calendar.getInstance();
                            calendar.setTimeInMillis(System.currentTimeMillis());
                            calendar.set(Calendar.HOUR_OF_DAY, mytesthourofday);
                            calendar.set(Calendar.MINUTE,
                                    Integer.parseInt(min_am_pm[0]));
                            // calendar.set(Calendar.AM_PM, am_pm_integer);
                            calendar.set(Calendar.SECOND, 0);
                            calendar.set(Calendar.MILLISECOND, 0);
    
                            if (calendar.getTimeInMillis() < System.currentTimeMillis()) {
                                calendar.add(Calendar.DAY_OF_MONTH, 1);
                            }
    
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP,
                                calendar.getTimeInMillis(), 1000 * 24 * 60 * 60,
                                pendingIntent);
    

    【讨论】:

    • 解释你的代码,以便 OP 获得更多提示,不要只是发布代码
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 2021-02-04
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多