【问题标题】:How to set time for alarm for next day in Android app?如何在Android应用程序中设置第二天的闹钟时间?
【发布时间】:2018-05-16 02:10:57
【问题描述】:

我正在创建一个 Android 应用程序,但遇到了问题。(我是 Android 开发新手)

在我的应用程序中,我想为今天设置闹钟。它适用于此,但我的问题是,当我想将时间选择器的时间设置为小于当前时间时,我的闹钟会立即响起。我想把那个时间定在明天的时间。我该怎么做?

【问题讨论】:

  • 显示你用来设置闹钟的代码。

标签: android


【解决方案1】:

在设置闹钟之前只需检查时间选择器的结果。我不确定你到底是如何设置闹钟的,或者你甚至使用什么样的闹钟,我会假设给定一个以毫秒为单位的时间,你可以计算出来。

public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    Calendar now = Calendar.getInstance();
    Calendar alarm = Calendar.getInstance();
    alarm.set(Calendar.HOUR_OF_DAY, hourOfDay);
    alarm.set(Calendar.MINUTE, minute);
    long alarmMillis = alarm.getTimeInMillis();
    if (alarm.before(now)) alarmMillis+= 86400000L;  //Add 1 day if time selected before now
    setAlarm(alarmMillis);
}

public void setAlarm(long millis) { 
    /** Set your alarm here */
}

还有很多其他方法可以做到这一点,但我发现 Calendar 类通常适合初学者的时间操作。希望这会有所帮助。

编辑: 如果担心 DST,稍作修改即可解决问题:

public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    Calendar now = Calendar.getInstance();
    Calendar alarm = Calendar.getInstance();
    alarm.set(Calendar.HOUR_OF_DAY, hourOfDay);
    alarm.set(Calendar.MINUTE, minute);
    if (alarm.before(now)) alarm.add(Calendar.DAY_OF_MONTH, 1);  //Add 1 day if time selected before now
    setAlarm(alarm.getTimeInMillis());
}

您需要确保正确设置时区。上面的代码将使用系统根据您的 Android 区域设置设置的默认时区。使用 Calendar.getInstance(TimeZone zone) 获取特定时区的 Calendar 对象。

【讨论】:

  • +1 但请注意,这在 DST 更改时不会按预期工作。考虑使用 Joda Time 库。
  • 谢谢多纳尔 - 忘了 - 我已经编辑处理 DST。
  • 不确定他们是否更改了命名,但在 2.1 中,函数是“before()”而不是“isBefore()”...以防万一有人遇到问题。
  • 更正 isBefore() > before()。是从内存中写入的,所以可能只是假设返回布尔值的方法以'is'开头
【解决方案2】:

这是我在项目中使用的代码。我得到日历的实例,然后设置所需的时间并将其与实际时间值进行比较,如果它小于零(过去),我会添加一天。希望对您有所帮助。

Calendar c = Calendar.getInstance();
    c.set(Calendar.HOUR_OF_DAY, hour);
    c.set(Calendar.MINUTE, minute);
    c.set(Calendar.SECOND, second);
    long timeInMillis = c.getTimeInMillis();
    if(timeInMillis-System.currentTimeMillis()<0){
        //if its in past, add one day
        timeInMillis += 86400000;
    }
    //for instance start repeating intent
    alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多