【问题标题】:AlarmManager firing alarm past the time it was set on the same day, setRepeatingAlarmManager 在同一天设置的时间过后发出警报,setRepeating
【发布时间】:2013-07-12 20:17:58
【问题描述】:

所以基本上我有这个代码,时间返回 24 小时时间并每天重复闹钟。

public setAlarm(String time, Context context){
    String[] strTime;

    strTime = time.split(":");

    int hour, min, sec;
    //set when to alarm
    hour = Integer.valueOf(strTime[0]);
    min = Integer.valueOf(strTime[1]);
    sec = 0;

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.HOUR_OF_DAY, hour);
    cal.set(Calendar.MINUTE, min);
    cal.set(Calendar.SECOND, sec);
    //Create a new PendingIntent and add it to the AlarmManager
    Intent intent = new Intent(context, AlarmReceiverActivity.class);
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
    am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
}

无论如何,问题是当我在上午 9:10 设置闹钟时,闹钟会响起。为什么?如果设置超过系统时间,我希望它不会发出警报。前任。将闹钟设置为上午 9 点,系统时间为上午 9 点 10 分

【问题讨论】:

    标签: android alarmmanager android-alarms repeatingalarm


    【解决方案1】:

    我现在开始工作了。我添加了闹钟时间和当前时间的检查器。

    public setAlarm(String time, Context context){
            String[] strTime;
    
            strTime = time.split(":");
    
            int hour, min, sec;
            //set when to alarm
            hour = Integer.valueOf(strTime[0]);
            min = Integer.valueOf(strTime[1]);
            sec = 0;
    
            long _alarm = 0;
            Calendar now = Calendar.getInstance();
            Calendar alarm = Calendar.getInstance();
            alarm.set(Calendar.HOUR_OF_DAY, hour);
            alarm.set(Calendar.MINUTE, min);
            alarm.set(Calendar.SECOND, sec);
    
            if(alarm.getTimeInMillis() <= now.getTimeInMillis())
                _alarm = alarm.getTimeInMillis() + (AlarmManager.INTERVAL_DAY+1);
            else
                _alarm = alarm.getTimeInMillis();               
    
            //Create a new PendingIntent and add it to the AlarmManager
            Intent intent = new Intent(context, AlarmReceiverActivity.class);
            PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT);
            AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE);
            am.setRepeating(AlarmManager.RTC_WAKEUP, _alarm, AlarmManager.INTERVAL_DAY, pendingIntent);
        }
    

    【讨论】:

    • AlarmManager.INTERVAL_DAY+1 - 为什么要添加 +1?
    • 因为“如果一个警报被延迟(由于系统睡眠,例如,对于非_WAKEUP警报类型),将尽快下发跳过的重复。之后,将根据以后的警报下发到原来的时间表;它们不会随着时间的推移而漂移。例如,如果您设置了每隔一小时的重复闹钟,但手机从 7:45 到 8:45 一直处于睡眠状态,则将尽快发送闹钟手机唤醒,然后下一个闹钟将在 9:00 发送。“所以,如果您在同一天设置闹钟,闹钟就会响起
    【解决方案2】:

    接受的答案是错误的,因为我尝试了它然后想出了解决方案。

    这是错误的,因为您可以在此处看到: Calendar now = Calendar.getInstance(); Calendar alarm = Calendar.getInstance(); alarm.set(Calendar.HOUR_OF_DAY, hour); alarm.set(Calendar.MINUTE, min); alarm.set(Calendar.SECOND, sec);

    “现在日历”和“日历警报”无论如何都将始终相同,因为它们在代码中几乎完全相同的位置执行相同的操作,因此 Calendar.getInstance() 将始终相同。

    解决办法是这样的

        long _alarm;
        Calendar now = Calendar.getInstance();
        long oldtimer = now.getTimeInMillis();
    
        cal.set(Calendar.HOUR_OF_DAY, Hours2int);
        cal.set(Calendar.MINUTE, minutes2int);
        cal.set(Calendar.SECOND, cur_cal.get(Calendar.SECOND));
        cal.set(Calendar.MILLISECOND, cur_cal.get(Calendar.MILLISECOND));
        cal.set(Calendar.DATE, cur_cal.get(Calendar.DATE));
        cal.set(Calendar.MONTH, cur_cal.get(Calendar.MONTH));
    
        //Calendar alarm = Calendar.getInstance();
    
        long newtimer = cal.getTimeInMillis();
    
    
        if(newtimer < oldtimer) {
            //do the thing
        }
    

    【讨论】:

    • 或者更简单:if (cal.getTimeInMillis() &lt; System.currentTimeMillis()) { cal.add(Calendar.DATE, 1); }
    【解决方案3】:

    使用 setInexactRepeating 代替 setRepeating

        Calendar cal= Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, 9);
        cal.set(Calendar.MINUTE, 0);
        cal.set(Calendar.SECOND, 0);
        PendingIntent pi = PendingIntent.getService(context, 0,
            new Intent(context, MyClass.class),PendingIntent.FLAG_UPDATE_CURRENT);
        AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
       am.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
                                AlarmManager.INTERVAL_DAY, pi);
    

    【讨论】:

    • 当你想准确地发出警报时developer Android
    • 还是有同样的问题..Intent intent = new Intent(context, AlarmReceiverActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(context, 19248, intent, PendingIntent.FLAG_CANCEL_CURRENT); AlarmManager am = (AlarmManager) context.getSystemService(Activity.ALARM_SERVICE); am.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
    • 好的。让我再告诉你一个例子。我希望我的设备每天早上 9 点发出警报。如果系统时间已经是上午 9 点 10 分,我将闹钟设置为上午 9 点。设置完成后,闹钟会响起。此实例使用 .setReapeting 发生。如果设置超过系统时间,如何防止它报警?
    • 我的下一条评论是只添加支票 :) 很高兴它终于奏效了 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    相关资源
    最近更新 更多