Android 安卓-长时间报警后有时不会触发

Android 安卓-长时间报警后有时不会触发,android,Android,我的应用程序有一个大问题已经好几天了。如果我的英语不是以英语为母语,我会提前道歉。我实现了一个AlarmManager,让我的应用程序的用户可以选择在当前或第二天的任何时间启动某项服务。例如,用户可能会选择将我的服务时间设置为明天上午8:00,然后启动服务 报警管理器现在应该从现在开始等待计算的时间,直到选择的时间(我也手动计算了时间,这是正确的!),然后启动服务。我现在的问题是,有时alarmmanager正在启动我的服务,有时则没有。似乎如果它必须等待4个小时以上,它就不再工作了,也没有呼叫

我的应用程序有一个大问题已经好几天了。如果我的英语不是以英语为母语,我会提前道歉。我实现了一个AlarmManager,让我的应用程序的用户可以选择在当前或第二天的任何时间启动某项服务。例如,用户可能会选择将我的服务时间设置为明天上午8:00,然后启动服务

报警管理器现在应该从现在开始等待计算的时间,直到选择的时间(我也手动计算了时间,这是正确的!),然后启动服务。我现在的问题是,有时alarmmanager正在启动我的服务,有时则没有。似乎如果它必须等待4个小时以上,它就不再工作了,也没有呼叫我的服务。我已经设置了所有必要的许可,否则它将根本不起作用。您可以在下面查看alarmmanager的代码:

someIntent = new Intent();
someIntent.setAction("START_SERVICE");
AlarmManager alarams ;

alarmIntent = PendingIntent.getBroadcast(MainActivity.this, 0, someIntent, PendingIntent.FLAG_CANCEL_CURRENT);
alarams = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
alarams.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis()+delay, alarmIntent);
广播接收器的实现方式如下(并且已注册!):

正如我告诉你的,如果它不工作,它会在启动服务之前停止

编辑: 我有个主意。我在这个帖子里读到了一些东西:

我的意图“someIntent”的构造函数可能只适用于清单文件中声明的BroadcastReceivers。因此,在我的例子中,我可能应该使用
someIntent=newintent(“启动服务”)
而不是
someIntent=newintent();someIntent.setAction(“启动服务”)
。这种效应被称为隧道效应——我会弄明白的,如果它起作用,我会在这里发布我的经验。感谢您在提到的帖子上给出的详细解释!如果你有任何其他想法或与我相同的经历,请让我知道!
eMu

如果设备关闭并启动,则您将无法获得报警maanger广播接收器。
实施OnBootReceiver,它将接收完成的OnBoot,在那里您可以启动未触发的未决警报。

如果设备关闭并启动,则您将无法获得警报maanger广播接收器。
实施OnBootReceiver,它将接收完成的OnBoot,您可以在那里启动未触发的挂起报警。

感谢您的快速回复。在此期间,设备未关闭。它只是进入睡眠模式,但这不应该影响报警管理器,因为RTC_唤醒。是的,在这种情况下,RTC_唤醒应该已经传递了意图。因此,在测试越来越多之后,AlarmManager仍然不适用于我,我不明白为什么。我读smth。关于WAKE_LOCK,以及在广播接收器被呼叫后,手机进入睡眠模式之前,我的服务可能不再被呼叫。这是原因吗?我真的希望你能帮助我!!!!是的,如果您还没有实现WAKE_LOCK,那么您就不会达到目的。最好的方法是在你的应用程序中使用cwac唤醒服务。谢谢你的回答,你认为如果我在我的广播接收器中实现如下内容就足够了吗:powermanagerpm=(PowerManager)getSystemService(Context.POWER\u SERVICE);PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,“MY_WAKE_LOCK”);wl.acquire();startService(myIntent);wl.释放();我的意思是,如果在我开始服务之前我只持有WAKE_锁,然后它开始运行,然后我可以再次释放它,这足够了吗?谢谢你的快速回复。在此期间,设备未关闭。它只是进入睡眠模式,但这不应该影响报警管理器,因为RTC_唤醒。是的,在这种情况下,RTC_唤醒应该已经传递了意图。因此,在测试越来越多之后,AlarmManager仍然不适用于我,我不明白为什么。我读smth。关于WAKE_LOCK,以及在广播接收器被呼叫后,手机进入睡眠模式之前,我的服务可能不再被呼叫。这是原因吗?我真的希望你能帮助我!!!!是的,如果您还没有实现WAKE_LOCK,那么您就不会达到目的。最好的方法是在你的应用程序中使用cwac唤醒服务。谢谢你的回答,你认为如果我在我的广播接收器中实现如下内容就足够了吗:powermanagerpm=(PowerManager)getSystemService(Context.POWER\u SERVICE);PowerManager.WakeLock wl=pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK,“MY_WAKE_LOCK”);wl.acquire();startService(myIntent);wl.释放();我的意思是,如果我在开始服务之前只持有WAKE_锁,然后它开始运行,然后我可以再次释放它,这足够了吗?
alarmReceiver = new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {

                Intent myIntent = new Intent(MainActivity.this, MyService.class);
                startService(myIntent);
            }
        };