Android Can';t取消AlarmManager,因为它';s实例在几个小时后为空

Android Can';t取消AlarmManager,因为它';s实例在几个小时后为空,android,broadcastreceiver,alarmmanager,android-alarms,android-broadcastreceiver,Android,Broadcastreceiver,Alarmmanager,Android Alarms,Android Broadcastreceiver,我正在实现一个AlarmManager,目的是尝试每30分钟连接一个服务器,直到服务器返回200 if (resultCode != 200){ alarmMgr = (AlarmManager) ApplicationContextProvider.getContext().getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ApplicationContextProvider.getConte

我正在实现一个AlarmManager,目的是尝试每30分钟连接一个服务器,直到服务器返回200

if (resultCode != 200){
    alarmMgr = (AlarmManager) ApplicationContextProvider.getContext().getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(ApplicationContextProvider.getContext(), MAUAlarmReceiver.class);
    alarmIntent = PendingIntent.getBroadcast(ApplicationContextProvider.getContext(), 0, intent, 0);
    alarmMgr.setInexactRepeating(AlarmManager.ELAPSED_REALTIME,SystemClock.elapsedRealtime() + AlarmManager.INTERVAL_HALF_HOUR, AlarmManager.INTERVAL_HALF_HOUR, alarmIntent);        
}
当服务器返回200时,使用以下代码停止报警:

if (resultCode == 200){
    if (alarmMgr!= null) {
        alarmMgr.cancel(alarmIntent);
    }
}
问题是,如果此警报持续几个小时,然后服务器返回200,当它尝试取消警报时,alarmMgr变量为“null”,因为它已被操作系统清除。然后,警报将每隔30分钟调用一次,而不是取消。在这种情况下,我怎样才能取消闹钟呢


谢谢。

不要缓存AlarmManager对象。有几种方法可以使用报警ID检索相同的报警,在您的情况下,您使用0作为该报警的ID

您可以使用下面的代码检索相同的警报,并可以取消它

AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(ApplicationContextProvider.getContext(), MAUAlarmReceiver.class);
PendingIntent alarmIntent = PendingIntent.getBroadcast(ApplicationContextProvider.getContext(), 0, intent, 0);
alarmManager.cancel(pendingIntent);

先检查它是否为空?@TimCastelijns你是什么意思?我正在检查它,因为它是空的,我不能取消它。我想取消它!如果不是,则每30分钟调用一次警报。如果为空,则会得到一个新的alarmmanager引用。请提供更多上下文,此代码在哪里运行?如何初始化AlarmManager?首选作业服务创建报警的新实例将用于取消以前的活动实例?您100%确定吗?@NullPointerException请参阅更新。。给我几分钟时间,我正在用docs更新它:)当应用程序的其余部分在关闭数小时后被垃圾收集时,我的应用程序类还会返回一个上下文吗?我之所以这样问,是因为在您的解决方案中,您正在使用我的应用程序类创建一个具有该上下文“ApplicationContextProvider.getContext()”@NullPointerException Yes的新实例,直到您的应用程序未被用户终止,它才可用。如果你的应用程序被用户杀死,你的警报将在那时被取消。我从最近的应用程序列表中删除了该应用程序,这或多或少意味着被杀死。闹钟还在响。在这种情况下,应用程序类会返回上下文吗?我不想有例外。