Java Android:停止locationManager在清单中注册的broadcastreceiver内更新

Java Android:停止locationManager在清单中注册的broadcastreceiver内更新,java,android,broadcastreceiver,android-pendingintent,locationmanager,Java,Android,Broadcastreceiver,Android Pendingintent,Locationmanager,我在清单文件中注册了一个BroadcastReceiver,这样即使在应用程序被关闭后,它也会收到位置更新 <receiver android:name="com.tenforwardconsulting.cordova.bgloc.LocationReceiver"> <intent-filter> <action android:name="myBroadcast" /> <action android:nam

我在清单文件中注册了一个
BroadcastReceiver
,这样即使在应用程序被关闭后,它也会收到位置更新

<receiver android:name="com.tenforwardconsulting.cordova.bgloc.LocationReceiver">
    <intent-filter>
        <action android:name="myBroadcast" />
        <action android:name="stopUpdating" />
    </intent-filter>
</receiver>
这是伟大的工程,即使在应用程序关闭后,我不断得到更新。现在,当我想停止获取更新时,我可以使用
getComponentEnabledSetting()
设置我的
BroadcastReceiver
,并将其状态设置为disabled(禁用)。但我很确定我的
挂起的内容将持续每一分钟。我似乎不知道如何阻止它。我试着在广播接收器中重新创建它,就像这里的许多答案一样

Intent intent1 = new Intent(context, LocationReceiver.class);
PendingIntent.getBroadcast(context, 58534, intent1, PendingIntent.FLAG_UPDATE_CURRENT).cancel();

但是每分钟都这样做之后,它就会继续通过
广播接收器
。我在这里做错了什么吗?

您需要完全按照初始设置时的样子重新创建PendingEvent,然后调用以停止位置更新回调

请注意,无需在PendingEvent上调用
cancel()

还要注意,您需要以某种方式持久化
会话\u id
,使用应用程序子类中的字段,或使用SharedReferences。这是正确重新创建挂起内容所必需的

因此,停止位置更新的代码如下:

Intent intent = new Intent(context, LocationReceiver.class);
intent.setAction("myBroadcast");
intent.putExtra("session_id", session_id);
PendingIntent lpendingIntent = PendingIntent.getBroadcast(activity.getApplicationContext(), 58534, intent, PendingIntent.FLAG_UPDATE_CURRENT);

//Unregister for broadcast intents
LocationManager locationManager  = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.removeUpdates(lpendingIntent);

您需要完全按照初始设置时的样子重新创建PendingEvent,并调用它以停止位置更新回调

请注意,无需在PendingEvent上调用
cancel()

还要注意,您需要以某种方式持久化
会话\u id
,使用应用程序子类中的字段,或使用SharedReferences。这是正确重新创建挂起内容所必需的

因此,停止位置更新的代码如下:

Intent intent = new Intent(context, LocationReceiver.class);
intent.setAction("myBroadcast");
intent.putExtra("session_id", session_id);
PendingIntent lpendingIntent = PendingIntent.getBroadcast(activity.getApplicationContext(), 58534, intent, PendingIntent.FLAG_UPDATE_CURRENT);

//Unregister for broadcast intents
LocationManager locationManager  = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.removeUpdates(lpendingIntent);

当应用程序关闭时,您如何进行交互?您是否使用服务?我对这段代码了解不多,但如果您只想切换位置更新,那么就创建一个服务,这样它就可以在后台工作。然后,您可以使用小部件停止和启动此服务。最后在服务内部注册您的接收者。并在停止时注销。当应用程序关闭时,您如何进行交互?您是否使用服务?我对这段代码了解不多,但如果您只想切换位置更新,那么就创建一个服务,这样它就可以在后台工作。然后,您可以使用小部件停止和启动此服务。最后在服务内部注册您的接收者。停车后注销,你就是那个人。我没有意识到它必须如此精确。我想是同一个ID。现在可以了,非常感谢。你就是那个人。我没有意识到它必须如此精确。我想是同一个ID。现在可以用了,非常感谢。