警报管理器未通知

时间:2015-10-15 03:32:09

标签: android alarmmanager

我有一个简单的代码设置,可以在特定的时间间隔通知用户。虽然getDate方法返回未来时间,但它仍会立即触发!

Intent notificationIntent = new Intent(act, NotificationPublisher.class);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION_ID, idTT);
notificationIntent.putExtra(NotificationPublisher.NOTIFICATION, notification);
PendingIntent pendingIntent = PendingIntent.getBroadcast(act, idTT, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager) act.getSystemService(Context.ALARM_SERVICE);

Date dd = getDate(dateTT);

Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.MONTH, dd.getMonth());
calendar.set(Calendar.YEAR, dd.getYear());
calendar.set(Calendar.DAY_OF_MONTH, dd.getDay());
calendar.set(Calendar.HOUR_OF_DAY, dd.getHours());
calendar.set(Calendar.MINUTE, dd.getMinutes());

alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,calendar.getTimeInMillis(), pendingIntent);

日历对象的固定日期 - 由于date.getMonth()和其他方法已被弃用,我不得不创建一个日历对象,然后获取Year

从日期创建日历对象 -

Calendar calTemp = Calendar.getInstance();
calTemp.setTime(ddTT);

获取月,年和其他领域 -

calendar.set(Calendar.MONTH, calTemp.get(Calendar.MONTH));
calendar.set(Calendar.YEAR, calTemp.get(Calendar.YEAR));
calendar.set(Calendar.DATE, calTemp.get(Calendar.DATE));
calendar.set(Calendar.HOUR_OF_DAY, calTemp.get(Calendar.HOUR_OF_DAY));
calendar.set(Calendar.MINUTE, calTemp.get(Calendar.MINUTE));

getDate方法jjust将日期转换为系统时区

        private Date getDate(String dateString) {
            SimpleDateFormat formatter = new SimpleDateFormat("MM/dd/yyyy HH:mm z");
            //formatter.setTimeZone(TimeZone.getTimeZone("EDT"));
            Date value = null;
            try {
                value = formatter.parse(dateString);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            SimpleDateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy HH:mm");
            dateFormatter.setTimeZone(TimeZone.getDefault());
            String dt = dateFormatter.format(value);

            try {
                value = dateFormatter.parse(dt);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            return value;
        }

我可能在这里遗漏了一些明显的东西,但我不知道它是什么!

1 个答案:

答案 0 :(得分:1)

您应该使用RTC_WAKEUP代替ELAPSED_REALTIME_WAKEUP

示例:

int trigger_time= System.currentTimeMillis() + 30 * 1000; //thirtySecondsFromNow 


if(Build.VERSION.SDK_INT >= 19) {
    am.setExact(AlarmManager.RTC_WAKEUP, trigger_time, 
            pendingIntent);
} else {
    am.set(AlarmManager.RTC_WAKEUP, trigger_time, 
            pendingIntent);
}

<强>解释

1)ELAPSED_REALTIME 根据自设备启动以来的时间来激活待处理的意图,但不会唤醒设备。经过的时间包括设备睡眠的任何时间。

2)ELAPSED_REALTIME_WAKEUP 在设备启动后经过指定的时间后,唤醒设备并触发待处理的意图。

3)RTC 在指定时间触发待处理的意图,但不会唤醒设备。

4)RTC_WAKEUP 唤醒设备以在指定时间触发待处理的意图。