我在我的Android应用中实现了BroadcastReceiver
(称为ProximityIntentReceiver
),但我有一些烦人的问题。在我的MainActivity
的onCreate()
方法中,我称之为此功能:
addProximityAlert():
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();
}
这是我的主要活动的垃圾:
ondestroy():
@Override
public void onDestroy() {
super.onDestroy();
accessTokenTracker.stopTracking();
if(proximityIntentReceiver!=null) {
unregisterReceiver(proximityIntentReceiver);
removeProximityAlert();
}
}
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()
方法足以删除BroadcastReceiver
的实例...
我应该添加什么代码?
a BroadcastReceiver
仅在执行其onReceive()
方法期间存在。因此,每次启动/接收到广播时,这都会评估一个抛弃实例。要动态注册/未注册BroadcastReceiver
s,您必须记住onPause()
中接收器的实例才能在onResume()
期间再次注册。
@Override
protected void onPause() {
unregisterReceiver(mReceiver);
super.onPause();
}
对于Activity
:
为了从应用中注册您的BroadcastReceiver
,首先,请从您的 androidmanifest.xml 文件中删除<receiver>
标签。然后,在您的onResume()
中致电registerReceiver(BroadcastReceiver receiver, IntentFilter filter)
。在您的onPause()
中使用unregisterReceiver(BroadcastReceiver receiver)
来取消BroadcastReceiver
。
对于Service
:
从清单文件中删除接收器标签。然后,您可以在onCreate()
中使用相同方法注册BroadcastReceiver
,并在onDestroy()
中取消注册。
从:1:取消注册广播接收器2:取消注册接收器
您可以在这里检查,这为您提供了有关BroadcastReceiver
s。
仍然没有解决您的问题,请让我知道。
我怀疑您的约束(point_radius等)没有被更新,因为您正在使用flags'0'检索待处理的意图:
PendingIntent.getBroadcast(this, 0, intent, 0);
LocationManager.addProximityAlert()
采用待处理意图,并使用其包含的意图设置一个反复的警报。如果您随后使用与上一个匹配的悬浮仪调用addProximityAlert()
(根据Intent.filterEquals()
),则警报不会更新,并且您的新约束将不会生效。
要修复,您需要设置正确的标志,以便待处理的意图替代了上一个。
PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
这里记录了标志(顺便说一句,我认为'0'是未定义的行为):http://developer.android.com/reference/reference/android/App/penderintent.html
nb,如果FLAG_UPDATE_CURRENT
不起作用,则可能需要FLAG_CANCEL_CURRENT
。