引导后在AlarmManager上设置时间

时间:2013-08-16 21:33:54

标签: android notifications alarmmanager

我正在尝试为我的应用添加“提醒”功能,让用户在“每天提醒我”,“每周提醒我”等选项中进行选择。

所以我刚刚创建了一个警报:

Intent notificationIntent = new Intent(this, BQBroadcastReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                System.currentTimeMillis() + 24HOURS,
                24HOURS, 
                pendingIntent);
到目前为止一切顺利。但是如果用户重新启动手机会发生什么?重启后将删除所有警报。我已经有一个BootBroadcastReveicer来重新启动警报,但是我要在重启后将警报周期设置为什么?

假设用户将闹钟设置为“在1天内提醒我”。然后将闹钟设置为24小时。但用户在23小时后重启手机。然后我的BootBroadcastReceiver在24小时内发出另一个警报。但我需要它在1小时内,而不是!

我该如何解决这个问题?我是否必须不断检查警报上还剩多少时间,并不断将其写入我的sharedPreferences,这样我就能重新启动重启后的剩余时间?似乎不是一个好方法。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您只需计算在BootBroatcastReceiver内发布通知之前的剩余时间。

例如

private long getNextNotificationTime() {
    long value = // calculate milliseconds until next notification
    return value;
}

现在,在接收器中使用此值。

long nextAlarmTime = this.getNextNotificationTime();

Intent notificationIntent = new Intent(this, BQBroadcastReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, notificationIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,
                nextAlarmTime,
                24HOURS, 
                pendingIntent);

这意味着你的闹钟只需要在开机时重新计算,然后每隔24小时开一次。

答案 1 :(得分:0)

 public long setAlarm( int id, int AlermHour, int AlermMinute,String title, String detail) {
        Intent intent = new Intent(c, OnetimeAlarmReceiver.class);
        intent.setData(Uri.parse("timer:" + id));
        intent.putExtra("title", title);
        intent.putExtra("detail", detail);

        AlarmManager alarmMgr0 = (AlarmManager)c.getSystemService(Context.ALARM_SERVICE);

        PendingIntent pendingIntent0 = PendingIntent.getBroadcast(c, id, intent, 0);
        Calendar timeOff9 = Calendar.getInstance();
        timeOff9.set(Calendar.HOUR_OF_DAY, AlermHour);
        timeOff9.set(Calendar.MINUTE, AlermMinute);
        timeOff9.set(Calendar.SECOND, 0);
        long _alarm = 0;
        if(timeOff9.getTimeInMillis() <= System.currentTimeMillis())
            _alarm = timeOff9.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
        else
            _alarm = timeOff9.getTimeInMillis();  

            alarmMgr0.setRepeating(AlarmManager.RTC_WAKEUP, _alarm,24*60*60*1000,pendingIntent0);

            return _alarm;



    }

使用此方法并使用闹钟时间,闹钟最小值来设置闹钟时间。它将自动设置您的时间而不是计算剩余时间。