Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.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,我需要我的服务在每晚02:00执行任务,如果任务失败,则计划自己在30分钟后重新启动,但如果成功,则停止自己并在另一天晚上02:00重新启动。我设法让它在02:00开始,但在它被触发后,它只是不断地触发自己 我的代码在服务中,下面是代码本身: @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); //doTasks();

我需要我的服务在每晚02:00执行任务,如果任务失败,则计划自己在30分钟后重新启动,但如果成功,则停止自己并在另一天晚上02:00重新启动。我设法让它在02:00开始,但在它被触发后,它只是不断地触发自己

我的代码在
服务中
,下面是代码本身:

@Override
    public void onStart(Intent intent, int startId) {
        super.onStart(intent, startId);

        //doTasks();

        MediaPlayer player = MediaPlayer.create(this,
                Settings.System.DEFAULT_NOTIFICATION_URI);
        player.start();

        AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE);
        alarmManager.cancel(pendingIntent);
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.HOUR_OF_DAY, 2);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent);
    }
doTasks()
是我需要运行的任务,但由于它们速度慢,我使用通知声音进行测试。而pendingent就是这个
服务本身


你知道是什么让我的
AlarmManager
不断触发吗?

如果你的
PendingEvent
设置为启动
服务
,那么基本上你每次都在用
onStart(…)
方法重复创建一个新的报警

AlarmManager
有一种机制,如果设备在本应触发时处于休眠状态,它将触发“延迟”报警。在您的情况下,因为您不断地重新创建报警,
AlarmManager
不断地认为应该立即触发报警,即使时间超过02:00:00


在其他地方创建报警,以防止每次启动
服务时不断地重新创建报警。

如果您的
pendingent
设置为启动
服务
,则基本上每次都在
onStart(…)
方法中重复创建报警。在其他地方创建报警(例如,在
活动中或在扩展
应用程序的类中)。但是,它不应该只在02:00触发,而不管它是在哪里创建的吗?是和否。
AlarmManager
有一种机制,它会“延迟”触发报警如果设备在本应触发时处于休眠状态。在您的情况下,因为您不断地重新创建报警,
AlarmManager
不断地认为应该立即触发报警,即使时间超过了02:00:00,onCreate中创建的报警仍然有效,显然,无论您在何处创建报警都很重要,我永远不会猜到。谢谢做一个答案,我会接受它作为工作解决方案。将评论转换为答案。