当前位置: 首页 > 知识库问答 >
问题:

Android AlarmManager设置第二天的警报

庾和昶
2023-03-14

我有一个应用程序,在指定的时间设置警报与TimePicker(24小时模式)。

我注意到,如果时间是23:00,而您将报警设置为01:00,AlarmManager会将其解释为已过日期。目前,我设置的警报如下所示:

private void setUpAlarm(int hour, int minute){
    long timeInMs = 0;
    long currentTimeInMs = 0;
    long timeDifference = 0;

    // Set up a calendar to calculate when the alarm should go off
    Calendar customCalendar = new GregorianCalendar();
    customCalendar.set(Calendar.HOUR_OF_DAY, hour);
    customCalendar.set(Calendar.MINUTE, minute);
    customCalendar.set(Calendar.SECOND, 0);
    customCalendar.set(Calendar.MILLISECOND, 0);

    Date customDate = customCalendar.getTime();

    timeInMs = customDate.getTime();
    currentTimeInMs = System.currentTimeMillis();
    timeDifference = timeInMs - currentTimeInMs;

    /*
     * If the user has entered a date that has passed (time difference is negative)
     * add 24 hours to the alarm time.
     */
    if(timeDifference < 0){
        timeInMs += 86400000;
    }

    //set the alarm
    Intent intent = new Intent(this, AlarmClockRingRing.class);
    action = PendingIntent.getActivity(this, (int)timeInMs,
            intent, 0); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
    am.set(AlarmManager.RTC_WAKEUP, timeInMs, action);
    Toast.makeText(this, "One shot alarm set at " + alarmTime, Toast.LENGTH_LONG).show();
}

正如你所看到的,该应用程序计算时差,如果时差为负值,则设置第二天的警报。这就产生了上面描述的bug。如何修复它?

当做

马库斯

共有2个答案

公冶麒
2023-03-14

只是一张纸条。。。

如果您使用的不是RTC_WAKEUPRTC,则不能使用系统。currentTimeMillis()

例如,已用时间使用系统时钟。elapsedRealtime()

https://developer.android.com/reference/android/app/AlarmManager.html#RTC_WAKEUP

章学义
2023-03-14

不过,我也面临着同样的问题,我设法改变了我的方法,而不是使用

customCalendar.set(Calendar.HOUR_OF_DAY, hour);
customCalendar.set(Calendar.MINUTE, minute);
customCalendar.set(Calendar.SECOND, 0);
customCalendar.set(Calendar.MILLISECOND, 0);

我把它改成了

customCalendar.setTimeInMillis(System.currentTimeMillis());
customCalendar.add(Calendar.HOUR_OF_DAY, diffHours);
customCalendar.add(Calendar.MINUTE, diffMinutes);
customCalendar.set(Calendar.SECOND, 0);
customCalendar.set(Calendar.MILLISECOND, 0);

像这样获取diffHoursdiffMinutes

diffHours   = timeDifference / (60 * 60 * 1000) % 24;
diffMinutes = timeDifference / (60 * 1000) % 60;

如果用户选择了相同的当前时间,而不是过去日期或未来日期,这意味着他希望警报在24小时后触发,以便:

if (timeDifference == 0) {
    diffHours = 24;
} 

如果我也想管理好几天呢?这样做

diffDays = timeDifference / (24 * 60 * 60 * 1000);

然后像这样把天转换成小时

if (diffDays != 0) {
    diffHours = diffHours + (diffDays * 24);
}

同时更改您的:

if (timeDifference < 0) {
    timeInMs += 86400000;
}

致:

if (timeDifference < 0) {
    timeDifference += 86400000;
}

还有你的:

am.set(AlarmManager.RTC_WAKEUP, timeInMs, action);

到:

am.set(AlarmManager.RTC_WAKEUP, customCalendar.getTimeInMillis(), action);
 类似资料:
  • 我正在使用firebase并用Android构建一个应用程序。 我有一个,我可以在其中选择星期几、小时和分钟。 当我选择日期并按submit时,我不想存储当前日期,甚至不想存储所选日期,而是存储与所选星期相关的下一个日期。 假设我选择星期四,明天是星期四,我想保存当前用户选择的日期和时间。 当时我试过这样的方法: 小时和分钟很好,但是我如何存储第二天/月/年?

  • 第二天Android程序设计基础. 2.1 深入了解安卓 2.1.1 工程结构解析 src: Java源代码目录(只允许有一个包) AndroidMainfest.xml: (清单文件,描述应用程序构成、组件、权限等配置信息) gen/R.java: 资源文件,修改后自动重新生成 Android: 库 assets: 静态资产文件(用于存放不编译的资源最大支持1G) drawable: 程序图标(

  • 我正在测试的手机是Android8.0,但这并不重要,因为我的目标是Android5.1。 所以我处理的代码设定了第二天的闹钟,06:00。 AlarmReciever仅启动服务:

  • 问题内容: 请建议是否有API支持来确定我的时间是否在2个实例之间,或者建议采用其他方法。 我有这个实体: 它存储工作日的开始和结束时间,即从“ 9:00”到“ 17:00”,或者从“ 22:00”到“ 5:00”的夜总会。 我需要实现一种确定该场所在给定时间是否开放的方法。 一个简单的/ 在这里不起作用,因为我们还需要确定结束时间是否在第二天。 当然,我们可以比较开始时间和结束时间并做出决定,但

  • 如何将一周的第一天设置为周一或周六? 我找不到方法或变量来更改它。如下图所示,一周的第一天是星期一。提前谢谢。 链接github DateRangePickerhttps://github.com/savvisingh/DateRangePicker 谢谢你的答案。我终于明白了。您需要初始化区域设置和时区以更改一周的第一天。不是您必须更改的日历。也不需要破坏库代码。

  • 本文向大家介绍MySQL学习第二天 安装和配置mysql winx64,包括了MySQL学习第二天 安装和配置mysql winx64的使用技巧和注意事项,需要的朋友参考一下 一、安装方式        MySQL安装文件分为两种,一种是MSI格式的,一种是ZIP格式的。下面来看看这两种方式:        MSI格式的可以直接点击安装,按照它给出的安装提示进行安装,Windows操作系统下一般M