【问题标题】:How to set correct alarm/notification time in android?如何在android中设置正确的警报/通知时间?
【发布时间】:2019-08-18 07:32:57
【问题描述】:

我的问题是我从第三方 api 获取我的视频游戏发布日期数据,并且第三方 api 的日期以毫秒为单位,当我使用 java 的 Calendar 类设置我的警报时,警报/通知在错误的时间,在android中设置警报的最佳方法是什么,以便它们总是在正确的时间被调用?

例如,我现在的代码很奇怪。游戏本周五发布,我在周五和本周四东部时间晚上 8 点为这款游戏设置了警报,警报/通知被触发。为什么周五午夜不开火?

这是我的 setAlarm 方法

    /**
     * Sets the next alarm to run. When the alarm fires,
     * the app broadcasts an Intent to this WakefulBroadcastReceiver.
     */
    public void setAlarm(Context context, Alarm alarm) {
        AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
        // Passing our intent data
        Intent alarmIntent = new Intent(context, AlarmReceiver.class);
        alarmIntent.putExtra("releaseId", alarm.getReleaseID());
        alarmIntent.putExtra("gameName", alarm.getGameName());
        alarmIntent.putExtra("gameId", alarm.getGameId());
        alarmIntent.putExtra("releaseDate", alarm.getDate());
        alarmIntent.putExtra("type", alarm.getType());
        // Note the release id is used here
        String alarmId = String.valueOf(alarm.getReleaseID()) + getTypeId(alarm.getType());
        PendingIntent pendingIntent  = PendingIntent.getBroadcast(context, Integer.parseInt(alarmId), alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);
        TimeZone timeZone = TimeZone.getTimeZone("UTC");
        Calendar calendar = Calendar.getInstance(timeZone);
        calendar.setTimeInMillis(alarm.getDate());
        Date date = calendar.getTime();
        alarmManager.set(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
    }

【问题讨论】:

  • 看起来像是时区问题。您从第三方获得的“警报”对象是什么?自纪元以来的毫秒数?您似乎创建了一个日历,然后也从中获得了自纪元以来的毫秒数?
  • 是自纪元以来的毫秒数,我创建了一个日历并使用 alarm.getDate() 从 api 获取自纪元以来的毫秒数

标签: android android-intent notifications alarmmanager android-pendingintent


【解决方案1】:

android 4.4后使用setExact;android 6.0后使用setExactAndAllowWhileIdle 链接https://developer.android.google.cn/training/monitoring-device-state/doze-standby.html#restrictions https://developer.android.google.cn/about/versions/android-4.4.html#BehaviorAlarms

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, date.getTime(), pendingIntent);
} else 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);
}

【讨论】:

    【解决方案2】:

    【讨论】:

    • GeregorianCalendar 与 Calendar 相比有什么优势?首先使用日历的目的是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-10
    • 1970-01-01
    相关资源
    最近更新 更多