【问题标题】:Android AlarmManager setting an alarm for the next dayAndroid AlarmManager 设置第二天的闹钟
【发布时间】:2014-09-25 11:45:05
【问题描述】:

我有一个应用程序,可以在使用 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();
}

如您所见,该应用会计算时差,如果为负数,则会设置第二天的闹钟。这会产生上述错误。如何解决?

问候,

马库斯

【问题讨论】:

    标签: android calendar alarmmanager


    【解决方案1】:

    虽然我也遇到过同样的问题,但我设法改变了我的方法,而不是使用

    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);
    

    【讨论】:

      【解决方案2】:

      只是一个注释...

      如果您使用RTC_WAKEUPRTC 以外的其他内容,则不能使用System.currentTimeMillis()

      例如 ELAPSED_TIME 使用SystemClock.elapsedRealtime()

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-19
        相关资源
        最近更新 更多