我在我的Android应用中实现了BroadcastReceiver
(称为ProximityIntentReceiver
),但我有一些恼人的问题。在我onCreate()
的{{1}}方法中,我将此函数称为:
addProximityAlert():
MainActivity
相反,这是我的MainActivity的onDestroy:
的onDestroy():
private ProximityIntentReceiver proximityIntentReceiver;
private void addProximityAlert() {
pendingIntentList = new HashMap<Integer, PendingIntent>();
double latitude = 37.567072;
double longitude = 14.273046;
Intent intent = new Intent(PROX_ALERT_INTENT);
PendingIntent proximityIntent = PendingIntent.getBroadcast(this, 0, intent, 0);
locationManager.addProximityAlert(
latitude, // the latitude of the central point of the alert region
longitude, // the longitude of the central point of the alert region
POINT_RADIUS, // the radius of the central point of the alert region, in meters
PROX_ALERT_EXPIRATION, // time for this proximity alert, in milliseconds, or -1 to indicate no expiration
proximityIntent // will be used to generate an Intent to fire when entry to or exit from the alert region is detected
);
pendingIntentList.put(1, proximityIntent);
proximityIntentReceiver = new ProximityIntentReceiver();
registerReceiver(proximityIntentReceiver, filter);
Toast.makeText(getApplicationContext(),"Alert Added",Toast.LENGTH_SHORT).show();
}
removeProximityAlert():
@Override
public void onDestroy() {
super.onDestroy();
accessTokenTracker.stopTracking();
if(proximityIntentReceiver!=null) {
unregisterReceiver(proximityIntentReceiver);
removeProximityAlert();
}
}
现在,如果我在private HashMap<Integer, PendingIntent> pendingIntentList;
private void removeProximityAlert () {
Iterator<Map.Entry<Integer, PendingIntent>> iterator = pendingIntentList.entrySet().iterator() ;
while(iterator.hasNext()){
Map.Entry<Integer, PendingIntent> pendingIntentMap = iterator.next();
locationManager.removeProximityAlert(pendingIntentMap.getValue());
}
}
或我的BroadcastReceiver
中更改了某些内容,则更改将保持不变,直到重新启动设备为止。为什么?我认为通过调用addProximityAlert()
方法足以删除unregisterReceiver()
的实例...
我应该在代码中添加什么内容?
答案 0 :(得分:1)
BroadcastReceiver
仅在执行onReceive()
方法时存在。因此,每次广播被发送/接收时,这将评估为丢弃实例。要动态注册/取消注册BroadcastReceiver
,您必须记住onPause()
中接收者的实例,以便在onResume()
期间再次注册。
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
对于Activity
:
要在您的应用中注册BroadcastReceiver
,请先从 AndroidManifest.xml 文件中删除<receiver>
标记。然后,在registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
中致电onResume()
。使用unregisterReceiver(BroadcastReceiver receiver)
中的onPause()
取消注册BroadcastReceiver
。
对于Service
:
从清单文件中删除接收器标记。然后,您可以在BroadcastReceiver
中使用相同的方法注册onCreate()
,并在onDestroy()
中取消注册。
参考自:1:Unregister broadcast receiver 2:unregister receiver
您可以查看here,其中提供了有关BroadcastReceiver
的工作的更多详细信息。
仍然没有解决您的问题,请告诉我。
答案 1 :(得分:0)
我怀疑您的约束(POINT_RADIUS等)没有更新,因为您正在使用标记'0'检索待处理的意图:
PendingIntent.getBroadcast(this, 0, intent, 0);
LocationManager.addProximityAlert()
获取您提供的待处理意图,并使用其包含的意图设置定期警报。如果您随后使用与前一个匹配的PendingIntent调用addProximityAlert()
(根据Intent.filterEquals()
),则警报将不会更新,并且您的新约束将不会生效。
要修复,您需要设置正确的标志,以便挂起的意图替换前一个意图。
PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
这里记录了标志(顺便说一句,我认为'0'是未定义的行为):http://developer.android.com/reference/android/app/PendingIntent.html
注意,如果FLAG_UPDATE_CURRENT
不起作用,则可能需要FLAG_CANCEL_CURRENT
。