Android - 如何销毁BroadcastReceiver?

时间:2015-05-04 11:36:55

标签: android broadcastreceiver proximity ondestroy

我在我的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()的实例...

我应该在代码中添加什么内容?

2 个答案:

答案 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