Android-如何摧毁广播员



我在我的Android应用中实现了BroadcastReceiver(称为ProximityIntentReceiver),但我有一些烦人的问题。在我的MainActivityonCreate()方法中,我称之为此功能:

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());
    }
}

现在,如果我在BroadcastReceiveraddProximityAlert()上更改某些内容,则更改保持不变,直到重新启动设备为止。为什么?我认为通过调用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:取消注册接收器

您可以在这里检查,这为您提供了有关BroadcastReceivers。

工作的更多详细信息。

仍然没有解决您的问题,请让我知道。

我怀疑您的约束(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

相关内容

  • 没有找到相关文章

最新更新