【问题标题】:Android - How to destroy a BroadcastReceiver?Android - 如何销毁广播接收器?
【发布时间】:2015-05-04 11:36:54
【问题描述】:

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

这是我的 MainActivity 的 onDestroy:

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 的实例...

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

【问题讨论】:

  • > 现在,如果我在我的 BroadcastReceiver 或我的 addProximityAlert 中更改某些内容,更改将保持不变,直到我重新启动设备。 具体来说,您要更改什么以及您期望什么去看看?
  • 例如,如果我更改 POINT_RADIUS 变量或其他...

标签: android broadcastreceiver proximity ondestroy


【解决方案1】:

BroadcastReceiver 仅在其 onReceive() 方法执行期间存在。因此,每次广播被触发/接收时,这都会评估为一次性实例。对于BroadcastReceivers 的动态注册/注销,您必须记住onPause() 中的接收器实例,以便在onResume() 期间再次注册。

@Override
protected void onPause() {
    unregisterReceiver(mReceiver);
    super.onPause();
}

对于Activity

为了在您的应用中注册您的BroadcastReceiver,首先,从您的AndroidManifest.xml 文件中删除&lt;receiver&gt; 标记。然后,在您的onResume() 中拨打registerReceiver(BroadcastReceiver receiver, IntentFilter filter)。在onPause() 中使用unregisterReceiver(BroadcastReceiver receiver) 取消注册BroadcastReceiver

对于Service

从清单文件中删除接收者标签。然后您可以在onCreate() 中使用相同的方法注册您的BroadcastReceiver 并在onDestroy() 中取消注册。

引用自:1:Unregister broadcast receiver 2:unregister receiver

您可以查看here,它为您提供有关BroadcastReceivers 工作的更多详细信息。

你的问题还没有解决,请告诉我。

【讨论】:

  • 所以我必须从 onDestroy 中删除 unregisterReceiver 方法并在 onPause 中调用它?我必须从我的 addProximityAlert 中删除 registerReceiver?
  • 你应该从 onPause() 方法中注销它。
  • 对不起,我在完成评论之前不小心按了 Enter 键
  • 没关系。您应该需要取消注册接收者表单 onPause() 并需要从 onResume() 注册接收者。
  • 我进行了这些更改,但问题仍然存在...如果您重新启动手机,接收器会被呼叫,否则不会发生任何事情
【解决方案2】:

我怀疑您的约束(POINT_RADIUS 等)没有更新,因为您正在检索带有标志“0”的待处理意图:

PendingIntent.getBroadcast(this, 0, intent, 0);

LocationManager.addProximityAlert() 获取您给它的待处理意图,并使用它包含的意图设置重复警报。如果您随后调用 addProximityAlert() 并使用与前一个匹配的 PendingIntent(根据 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

【讨论】:

    猜你喜欢
    • 2011-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多