Android:AlarmManager会在过去一段时间内触发

时间:2014-02-16 13:38:42

标签: android alarmmanager

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

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小时模式。这可能是个问题吗?

谢谢!

2 个答案:

答案 0 :(得分:10)

当然它确实......这意味着要这么做 Android认识到时间已经过去,所以它会触发警报,即使它已经很晚了。

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

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

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

答案 1 :(得分:0)

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

    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