Android - 如何销毁广播接收器?

标签 android broadcastreceiver proximity ondestroy

我在我的 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仅在执行其 onReceive() 期间存在方法。因此,每次广播被触发/接收时,这都会评估为一个一次性实例。用于动态注册/注销BroadcastReceiver s,你必须记住 onPause() 中接收者的实例在onResume()期间再次注册.

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

对于 Activity :

为了注册您的BroadcastReceiver首先,在您的应用程序中删除 <receiver>来自 AndroidManifest.xml 文件的标记。然后,调用registerReceiver(BroadcastReceiver receiver, IntentFilter filter)在你的onResume() 。使用unregisterReceiver(BroadcastReceiver receiver)在你的onPause()取消注册BroadcastReceiver .

对于Service :

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

引用来源:1:Unregister broadcast receiver 2:unregister receiver

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

您的问题仍未解决,请告诉我。

关于Android - 如何销毁广播接收器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30029177/

相关文章:

android - onNext 启动另一个 Observable

android - 如何在仪器中注册广播接收器?

python - 根据元素的条件值对 numpy 数组元素进行排序

mysql - 仅获取给定列值的一行

ios - 从 CLProximity 获取距离

android - 将图像保存到本地存储/从本地存储加载图像

android - 如何获取用户的谷歌市场帐户?

android - 如何在 ListView 的每一列上创建属性名称?

android - Android 中发送广播的最大可接受频率

java - Android 自动文本回复使用广播接收器发送多个文本。