Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java AlarmManager未在正确的时间启动_Java_Android_Alarmmanager_Timepicker - Fatal编程技术网

Java AlarmManager未在正确的时间启动

Java AlarmManager未在正确的时间启动,java,android,alarmmanager,timepicker,Java,Android,Alarmmanager,Timepicker,我正在创建一个应用程序,它使用一个时间选择器,用户可以设置他们希望短信发送到指定号码的时间。他们还可以选择单击“重复”,以便在每天相同的指定时间继续发送SMS 我的问题是,它只是在我设置计时器后立即启动,而不是等待。我已经尝试过多次打乱间隔,但从逻辑上看,它似乎应该按原样工作,但事实并非如此 以下是从时间选择器获取时间和设置报警管理器的代码: Button setSchedule = (Button) setTimer.findViewById(R.id.setSchedule); setSch

我正在创建一个应用程序,它使用一个时间选择器,用户可以设置他们希望短信发送到指定号码的时间。他们还可以选择单击“重复”,以便在每天相同的指定时间继续发送SMS

我的问题是,它只是在我设置计时器后立即启动,而不是等待。我已经尝试过多次打乱间隔,但从逻辑上看,它似乎应该按原样工作,但事实并非如此

以下是从时间选择器获取时间和设置报警管理器的代码:

Button setSchedule = (Button) setTimer.findViewById(R.id.setSchedule);
setSchedule.setText("Set");
setSchedule.setOnClickListener(new OnClickListener()
{

    @Override
    public void onClick(View v) 
    {
        hours = timePicker.getCurrentHour();
        minutes = timePicker.getCurrentMinute();
        minutesConv += hours * 60;
        minutes += minutesConv;
        seconds = minutes * 60;
        time = seconds * 1000;
        long currentTime = System.currentTimeMillis();

        CheckBox repeat = (CheckBox) setTimer.findViewById(R.id.repeat);

        Intent intentAlarm = new Intent(MainMenu.this, AlarmReceiver.class);
        PendingIntent pi = PendingIntent.getBroadcast(MainMenu.this, 0, intentAlarm, 0);
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);

        if (repeat.isChecked())
        {
            alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, time - currentTime, AlarmManager.INTERVAL_DAY, pi);
        }//end if
        else
        {
            alarmManager.set(AlarmManager.RTC_WAKEUP,  time - currentTime,  PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
                    PendingIntent.FLAG_UPDATE_CURRENT));
        }//end else

        Toast.makeText(MainMenu.this, "Your message has been scheduled to be repeated at " +
                                    hours + ":" + minutes, Toast.LENGTH_SHORT).show();
        setTimer.dismiss();
    }//end onClick

});
编辑:


如果我读取的是正确的,
triggerAtMillis
参数是绝对时间,而不是相对时间。通过
time+currentTime
而不是
time-currentTime
应该可以。因此,问题与报警的正确设置有关。基本上,报警管理器设置为您希望触发报警的绝对时间(以毫秒为单位)。你有几个选项来计算这个

  • 使用代码中的方法,获取用户输入的值并从currentTime(以毫秒为单位)计算增量。当用户指定他们希望在未来的某段时间内发出警报X时,此功能非常有用
  • 使用RTC示例中描述的日历方法: 这允许用户为报警指定时间或完整日期,您只需直接从calendar对象获取毫秒值
  • 请在日历中尝试此设置,以设置单个警报:

    hours = timePicker.getCurrentHour();
    minutes = timePicker.getCurrentMinute();
    
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY, hours);
    cal.set(Calendar.MINUTE, minutes);
    
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
        PendingIntent.FLAG_UPDATE_CURRENT));
    

    setTimeInMillis()将日历对象更新为当前日期(以便正确设置年份和所有其他内容)。然后,将日历设置为当天的未来时间,并将其传递给报警管理器。

    查看当前答案。时间-currentTime通常会在过去设置一个警报,这会导致警报立即触发。@iheani啊,这很有意义。是的。注意,(currentTime-time)会更好(尽管仍然是错误的)。幸运的是,(time-currentTime)将成为过去,因为currentTime通常是一个相当大的数字。而且,你对时间的计算是有缺陷的。它只包括分钟和秒-它不包括小时的值。@我的意思是我有小时的值,它只是获取计时器上设置的当前小时。然后我把它转换成分钟。看起来你更新了你的代码,添加了一行,上面写着“分钟+=minutesConv;”,我发表评论的时候没有。我试过了,然后闹钟就没有响。要么是这样,要么就是它比应该的时间晚了。你是不是在不久的将来设置了警报?检查所有输入是什么。同时检查一下你在警报响起后预期会发生什么,你发布的信息中没有包含这个代码。是的,我只会设置几分钟进行测试。短信部分工作正常。消息发送得很好,只是在我想要的时候没有发生。我觉得你的闹钟回调可能有问题,可能是看
    https://developer.android.com/training/scheduling/alarms.html
    将帮助您找到问题所在。你可以用对闹钟响做出反应的代码更新你的原始问题。你可能没有正确设置闹钟时间。您需要将希望警报触发的未来毫秒数添加到currentTime。通过使用calendar对象,我得到的时间值为负值。我使用日历添加了我的代码。我已经研究了今年的情况,是否应该设置为1970年或者其他什么,但是我没有看到任何清晰的东西。添加1970年或我见过的任何其他年份都没有任何帮助。你应该使用我给你的链接中的示例。它完全符合您的需要,并自动设置年份。@saboehnke我已经更新了答案,为您提供了示例代码。再加上答案中的链接,应该会告诉您如何处理反复出现的报警情况。
    hours = timePicker.getCurrentHour();
    minutes = timePicker.getCurrentMinute();
    
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(System.currentTimeMillis());
    cal.set(Calendar.HOUR_OF_DAY, hours);
    cal.set(Calendar.MINUTE, minutes);
    
    alarmManager.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), PendingIntent.getBroadcast(MainMenu.this, 1, intentAlarm,
        PendingIntent.FLAG_UPDATE_CURRENT));