Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.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 - Fatal编程技术网

Java AlarmManager在第二个间隔完成之前触发

Java AlarmManager在第二个间隔完成之前触发,java,android,alarmmanager,Java,Android,Alarmmanager,我写了一个每天早上5:22运行的报警代码。该代码在第一个时间间隔内工作正常,但在第二个时间间隔内会在24小时前触发 我在MainActivity的onCreate()方法中添加了报警代码,该代码在第一个时间间隔内运行良好,但在第一个时间间隔后,如果我打开MainActivity,报警将再次触发,并在打开MainActivity时继续触发。例如,如果我打开MainActivity两次,则会触发两次警报 我在这里也提到了一些解决方案,但它们的效果并不理想 我还试图检查是否使用FLAG_NO_CREA

我写了一个每天早上5:22运行的报警代码。该代码在第一个时间间隔内工作正常,但在第二个时间间隔内会在24小时前触发

我在MainActivity的
onCreate()
方法中添加了报警代码,该代码在第一个时间间隔内运行良好,但在第一个时间间隔后,如果我打开MainActivity,报警将再次触发,并在打开MainActivity时继续触发。例如,如果我打开MainActivity两次,则会触发两次警报

我在这里也提到了一些解决方案,但它们的效果并不理想

我还试图检查是否使用FLAG_NO_CREATE FLAG设置了报警,但仍然不起作用

下面是我的代码

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    AlarmManager alarmMgr = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, ServiceReceiver.class);

    PendingIntent alarmIntent = PendingIntent.getBroadcast(this, 11111, intent, 0);

    Calendar calNow = Calendar.getInstance();
    Calendar calSet = (Calendar) calNow.clone();

    calSet.set(Calendar.HOUR_OF_DAY, 5);
    calSet.set(Calendar.MINUTE, 11);
    calSet.set(Calendar.SECOND, 0);
    calSet.set(Calendar.MILLISECOND, 0);

    if(calSet.compareTo(calNow) <= 0){
        //Today Set time passed, count to tomorrow
        calSet.add(Calendar.DATE, 1);
    }

    alarmMgr.cancel(alarmIntent);
    alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calSet.getTimeInMillis(),
            AlarmManager.INTERVAL_DAY, alarmIntent); //1000 * 60 * 1440

}
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
AlarmManager alarmMgr=(AlarmManager)getSystemService(Context.ALARM\u服务);
Intent Intent=新的Intent(这个,ServiceReceiver.class);
PendingEvent alarmIntent=PendingEvent.getBroadcast(this,11111,intent,0);
Calendar calNow=Calendar.getInstance();
Calendar calSet=(Calendar)calNow.clone();
calSet.set(日历小时/天,5);
calSet.set(日历分钟,11);
calSet.set(日历秒,0);
calSet.set(日历毫秒,0);

如果(calSet.compareTo(calNow)您需要从服务的onStartCommand函数返回启动\u NOT \u STICKY。或者您必须在作业完成后停止它。或者您可以使用IntentService而不是Service。警报工作正常

public int onStartCommand(Intent intent, int flags, int startId){
    try{
        commitToFile("Start");
    }catch (Exception e){}
    try{
        commitToFile("End");
    }catch (Exception e){}
    return START_NOT_STICKY;
}

您返回了0,这是START\u not\u STICKY \u兼容性。当您的服务第一次启动并运行时,警报响起。当您重新启动应用程序时,您的服务也会重新启动,因为您没有停止它。如果您返回START\u not\u STICKY-服务将不会重新启动。或者,如果您使用IntentService,此服务将完成任务并自行完成自动。

您需要从服务的onStartCommand功能返回START\u NOT\u STICKY。或者您必须在作业完成后停止。或者您可以使用IntentService而不是Service。警报工作正常

public int onStartCommand(Intent intent, int flags, int startId){
    try{
        commitToFile("Start");
    }catch (Exception e){}
    try{
        commitToFile("End");
    }catch (Exception e){}
    return START_NOT_STICKY;
}

您返回了0,这是START\u not\u STICKY \u兼容性。当您的服务第一次启动并运行时,警报响起。当您重新启动应用程序时,您的服务也会重新启动,因为您没有停止它。如果您返回START\u not\u STICKY-服务将不会重新启动。或者,如果您使用IntentService,此服务将完成任务并自行完成自动。

每当调用MainActivity启动onCreate()时,就会出现报警通知的多个实例

AlarmManager alarmMgr=(AlarmManager)getSystemService(Context.ALARM\u服务); Intent Intent=新的Intent(这个,ServiceReceiver.class)

pendingent alarmIntent=pendingent.getBroadcast(this,11111,intent,0);
Calendar calNow=Calendar.getInstance();
Calendar calSet=(Calendar)calNow.clone();
calSet.set(日历小时/天,5);
calSet.set(日历分钟,11);
calSet.set(日历秒,0);
calSet.set(日历毫秒,0);

无论何时调用MainActivity启动onCreate(),都会调用if(calSet.compareTo(calNow),这样您就会得到多个报警通知实例

AlarmManager alarmMgr=(AlarmManager)getSystemService(Context.ALARM\u服务); Intent Intent=新的Intent(这个,ServiceReceiver.class)

pendingent alarmIntent=pendingent.getBroadcast(this,11111,intent,0);
Calendar calNow=Calendar.getInstance();
Calendar calSet=(Calendar)calNow.clone();
calSet.set(日历小时/天,5);
calSet.set(日历分钟,11);
calSet.set(日历秒,0);
calSet.set(日历毫秒,0);

if(calSet.compareTo(calNow)我想你的if语句不起作用。你调试过这个日期吗?你需要更多的日期控件,LogCat中的更多调试信息,你会发现它有什么问题。将日期转换为正常格式并进行比较。项目的目标SDK是什么(在清单中)?并且不使用克隆,这不是必需的。'if(calSet.getTimeInMillis()目标sdk版本为22@kolombo正在执行if条件,只需通过添加log在log cat中进行检查。我在if条件中进行了检查,但警报仍会提前触发。我想您的if语句不起作用。是否调试了此日期?您需要更多的日期控件,LogCat中的更多调试信息,您将看到它有什么问题。转换dates到正常格式并进行比较。项目的目标SDK是什么(在清单中)?并且不使用克隆,这不是必需的。'if(calSet.getTimeInMillis()目标sdk版本为22@kolombo正在执行if条件,只需通过添加log在log cat中进行检查。我处于if条件中,但警报仍会提前触发。感谢您的宝贵帮助。这对我非常有帮助。作为感谢,我将向您提供200英镑的赏金。@Searock欢迎您:-)这对我来说并不难。谢谢你的赏金:-)你可以用赏金奖励现有答案,可以吗?@Searock你可以用meta上的赏金帮助确认吗?你需要手动单击答案旁边的赏金。我过去曾经这样做过,我对其他人的答案给予赏金,所以如果我将赏金奖励给我自己的问题会有什么问题。有一个选项是“奖励现有答案”g答案。这个答案真的帮了我很大的忙,用户也帮了我很大的忙。:)谢谢你宝贵的帮助。这对我很有帮助。作为感谢,我会给你200英镑。@Searock不客气:-)这对我来说并不难。谢谢你的赏金:-)你可以用赏金奖励现有答案,可以吗?@Searock你可以用meta上的赏金帮助确认吗?你需要手动单击答案旁边的赏金我过去也这样做过,在那里我对其他人赏金过answ