Android: 停止 locationManager 在清单中注册的 broadcastreceiver 中更新
Android: Stop locationManager from updating within broadcastreceiver registered in manifest
我在清单文件中注册了一个 BroadcastReceiver
,这样即使应用程序被擦除关闭,它也会收到位置更新。
<receiver android:name="com.tenforwardconsulting.cordova.bgloc.LocationReceiver">
<intent-filter>
<action android:name="myBroadcast" />
<action android:name="stopUpdating" />
</intent-filter>
</receiver>
打开应用程序时,它会使用 pendingIntents
启动 locationManager
。
Intent intent = new Intent(context, LocationReceiver.class);
intent.setAction("myBroadcast");
intent.putExtra("session_id", session_id);
//intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
lpendingIntent = PendingIntent.getBroadcast(activity.getApplicationContext(), 58534, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//Register for broadcast intents
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, lpendingIntent);
效果很好,即使在应用程序关闭后我也会不断收到更新。现在,当我想停止获取更新时,我可以使用 getComponentEnabledSetting()
设置我的 BroadcastReceiver
并将其状态设置为禁用就好了。但我很确定我的 pendingIntent
会持续每一分钟。我似乎无法弄清楚如何阻止它。我已经尝试在 broadcastReceiver 中重新创建它,就像这里的许多答案一样......
Intent intent1 = new Intent(context, LocationReceiver.class);
PendingIntent.getBroadcast(context, 58534, intent1, PendingIntent.FLAG_UPDATE_CURRENT).cancel();
但它只是在每分钟执行一次后继续进入 BroadcastReceiver
。我是不是做错了什么?
您需要完全按照最初设置时的样子重新创建 PendingIntent,并调用 removeUpdates()
以停止位置更新回调。
请注意,无需对 PendingIntent 调用 cancel()
。
另请注意,您需要以某种方式持久化 session_id
,使用 Application 子类中的字段或使用 SharedPreferences。这是正确重新创建 PendingIntent 所必需的。
因此,停止位置更新的代码如下所示:
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);
我在清单文件中注册了一个 BroadcastReceiver
,这样即使应用程序被擦除关闭,它也会收到位置更新。
<receiver android:name="com.tenforwardconsulting.cordova.bgloc.LocationReceiver">
<intent-filter>
<action android:name="myBroadcast" />
<action android:name="stopUpdating" />
</intent-filter>
</receiver>
打开应用程序时,它会使用 pendingIntents
启动 locationManager
。
Intent intent = new Intent(context, LocationReceiver.class);
intent.setAction("myBroadcast");
intent.putExtra("session_id", session_id);
//intent.addFlags(Intent.FLAG_FROM_BACKGROUND);
lpendingIntent = PendingIntent.getBroadcast(activity.getApplicationContext(), 58534, intent, PendingIntent.FLAG_UPDATE_CURRENT);
//Register for broadcast intents
locationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 60000, 0, lpendingIntent);
效果很好,即使在应用程序关闭后我也会不断收到更新。现在,当我想停止获取更新时,我可以使用 getComponentEnabledSetting()
设置我的 BroadcastReceiver
并将其状态设置为禁用就好了。但我很确定我的 pendingIntent
会持续每一分钟。我似乎无法弄清楚如何阻止它。我已经尝试在 broadcastReceiver 中重新创建它,就像这里的许多答案一样......
Intent intent1 = new Intent(context, LocationReceiver.class);
PendingIntent.getBroadcast(context, 58534, intent1, PendingIntent.FLAG_UPDATE_CURRENT).cancel();
但它只是在每分钟执行一次后继续进入 BroadcastReceiver
。我是不是做错了什么?
您需要完全按照最初设置时的样子重新创建 PendingIntent,并调用 removeUpdates()
以停止位置更新回调。
请注意,无需对 PendingIntent 调用 cancel()
。
另请注意,您需要以某种方式持久化 session_id
,使用 Application 子类中的字段或使用 SharedPreferences。这是正确重新创建 PendingIntent 所必需的。
因此,停止位置更新的代码如下所示:
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);