【问题标题】:Android : AlarmManager fires off for past timeAndroid:AlarmManager 在过去一段时间内触发
【发布时间】:2014-02-16 13:38:42
【问题描述】:

这是我的警报管理器代码:

Intent intent=new Intent(getBaseContext(),AlarmReciever.class);
intent.setAction("com.example.projectx.ACTION");

PendingIntent pendingIntent=PendingIntent.getBroadcast(this,12345, intent,PendingIntent.FLAG_CANCEL_CURRENT);

AlarmManager alarmManager=(AlarmManager)getSystemService(Activity.ALARM_SERVICE);

alarmManager.set(AlarmManager.RTC_WAKEUP,targetCal.getTimeInMillis(),pendingIntent);

如果我选择在未来一小时/分钟触发警报,该代码将非常有效。但是,如果我选择过去的一小时/分钟,它会在我点击“设置闹钟”时立即启动。

例子:

  • 现在是 15:00,我把闹钟定在 15:45,闹钟在 15:45 响,一切正常

  • 现在是15:00,我设置了14:30的闹钟,一点击“设置闹钟”就响了!

我的时间选择器始终设置为 24 小时模式。会不会有问题?

谢谢!

【问题讨论】:

  • 向我们展示targetCal的实例化

标签: android alarmmanager


【解决方案1】:

当然可以……它本来就是这样工作的。
Android 会识别到时间已经过去,所以它会发出警报,即使已经很晚了。

您可以确保为闹钟设置的时间在当前时间之后。 只需计算这个差异:

int diff = Calendar.getInstance().getTimeInMilis() - targetCal.getTimeInMillis();

如果 diff 大于 0,则在日历中添加一天 (targetCal)
现在,您设备的时间将比下一个预定的闹钟时间(而不是)。

【讨论】:

    【解决方案2】:

    我认为您已经找到了解决问题的方法,但我想分享一个带有代码的具体示例,以便那些遇到相同问题并阅读这篇文章的人可以更轻松一些。

        AlarmManager alarmManager = (AlarmManager) MainActivity.this.getSystemService(MainActivity.this.ALARM_SERVICE);
        Intent startServiceIntent = new Intent(MainActivity.this,Hintergrundservice.class);
        PendingIntent startServicePendingIntent = PendingIntent.getBroadcast(MainActivity.this,0,startServiceIntent,0);
        Calendar caldendar = Calendar.getInstance();
        caldendar.setTimeInMillis(System.currentTimeMillis());
        caldendar.set(Calendar.HOUR_OF_DAY,7);
        caldendar.set(Calendar.MINUTE,1);
        //long TimeDiffSL = caldendar.getTimeInMillis() - System.currentTimeMillis();
        long TimeUntilTrigger;
        if (System.currentTimeMillis() > caldendar.getTimeInMillis()){
            TimeUntilTrigger = caldendar.getTimeInMillis() + 86400000;
            Toast.makeText(getApplicationContext(),"Morgen erst",Toast.LENGTH_LONG).show();
        }else{
            TimeUntilTrigger = caldendar.getTimeInMillis();
            Toast.makeText(getApplicationContext(),"Heute noch",Toast.LENGTH_LONG).show();
        }
    
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,TimeUntilTrigger,AlarmManager.INTERVAL_DAY,startServicePendingIntent);
    

    所以我们的目标是每天早上 7:01 拨打服务Hintergrundservice.class

    【讨论】:

    • 翻译(我认为):“Morgen erst”= 明天早上,“Heuite noch”= 今天/今天晚些时候,“Hintergrund”= 背景。 :)
    • 是的,但要澄清一下:“Morgen erst”表示闹钟不会在今天,但会在明天,因为闹钟时间已经过了当前时间。 “Heute noch”的意思是它足够早地设置今天的闹钟,因为今天的闹钟时间将在未来。问题是,我需要那一天,应该叫警报。警报每次设置为下一次实时匹配警报时间,而不是过去的时间或未来的时间。希望这会有所帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多