【问题标题】:Setting an alarm the correct way设置闹钟的正确方法
【发布时间】:2018-07-29 18:12:07
【问题描述】:

我正在使用 API 为我的 Android 应用获取电影版本,并且发布日期以 UTC 毫秒为单位。当我采用该发布日期并将其设置在用户的手机上时,它会在他的时区进行转换并被调用。

示例:

电影的上映日期(以毫秒为单位):

1509667200000

到UTC时间和日期:

2017 年 11 月 3 日星期五 00:00:00

到本地时间和日期:(东部时间,我的时区)

2017 年 11 月 2 日星期四 20:00:00

当我设置闹钟时

    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(releaseDate);
    Date date = calendar.getTime();
    alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), alarmIntent);

警报在 2017 年 11 月 2 日 20:00:00 被调用,但它需要在 11 月 3 日午夜被调用。

谢谢

【问题讨论】:

标签: android alarmmanager


【解决方案1】:

我做了什么,现在效果很好:

    // Calendar
    TimeZone timeZone = TimeZone.getTimeZone("UTC");
    Calendar calendar = Calendar.getInstance(timeZone);
    calendar.setTimeInMillis(releaseDate);
    Date date = calendar.getTime();
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    } else {
        alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    }

【讨论】:

  • 你试过没有timeZone
  • 是的,结果相同
【解决方案2】:

您可以尝试将时区设置为 UTC

calendar.setTimeZone(TimeZone.getTimeZone("UTC"));

【讨论】:

    【解决方案3】:

    我有几天在使用警报应用程序。 我已经完成了学校课程表的警报模块。 我所做的是……

    @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
    
                Calendar calNow = Calendar.getInstance();
                Calendar calSet = (Calendar) calNow.clone();
    
                calSet.set(Calendar.HOUR_OF_DAY, hourOfDay);
                calSet.set(Calendar.MINUTE, minute);
                calSet.set(Calendar.SECOND, 0);
                calSet.set(Calendar.MILLISECOND, 0);
    
                if(calSet.compareTo(calNow) <= 0){
                    //Today Set time passed, count to tomorrow
                    calSet.add(Calendar.DATE, 1);
                }
    
                setAlarm(calSet);
            }};
    
        private void setAlarm(Calendar targetCal){
    
            textAlarmPrompt.setText(
                    "\n\n***\n"
                    + "Alarm is set@ " + targetCal.getTime() + "\n"
                    + "***\n");
    
            Intent intent = new Intent(getBaseContext(), AlarmReceiver.class);
            PendingIntent pendingIntent = PendingIntent.getBroadcast(getBaseContext(), RQS_1, intent, 0);
            AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
    //      alarmManager.set(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(), pendingIntent);
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, targetCal.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    

    【讨论】:

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