Java 取消注册广播接收器错误

Java 取消注册广播接收器错误,java,android,bluetooth,broadcastreceiver,android-broadcastreceiver,Java,Android,Bluetooth,Broadcastreceiver,Android Broadcastreceiver,我想在我的android应用程序中获得可用的蓝牙设备,以便我可以通过我的应用程序配对或删除设备。我正在注册广播接收器,以通知我的新设备列表。我在活动中执行此操作,但当我使用finish()销毁活动时,即使我正在注销接收器,它仍会不断给我以下错误 例外情况: 03-10 10:24:48.790 25219-25219/com.vidame E/ActivityThread: Activity com.vidame.Activities.BloodPressureActivity has leak

我想在我的android应用程序中获得可用的蓝牙设备,以便我可以通过我的应用程序配对或删除设备。我正在注册广播接收器,以通知我的新设备列表。我在活动中执行此操作,但当我使用
finish()
销毁活动时,即使我正在注销接收器,它仍会不断给我以下错误

例外情况:

03-10 10:24:48.790 25219-25219/com.vidame E/ActivityThread: Activity com.vidame.Activities.BloodPressureActivity has leaked IntentReceiver com.vidame.HelperClasses.Bluetooth$mPairReceiver@37341ff5 that was originally registered here. Are you missing a call to unregisterReceiver()?
android.app.IntentReceiverLeaked: Activity com.vidame.Activities.BloodPressureActivity has leaked IntentReceiver com.vidame.HelperClasses.Bluetooth$mPairReceiver@37341ff5 that was originally registered here. Are you missing a call to unregisterReceiver()?
    at android.app.LoadedApk$ReceiverDispatcher.<init>(LoadedApk.java:904)
    at android.app.LoadedApk.getReceiverDispatcher(LoadedApk.java:705)
    at android.app.ContextImpl.registerReceiverInternal(ContextImpl.java:1685)
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1665)
    at android.app.ContextImpl.registerReceiver(ContextImpl.java:1659)
    at android.content.ContextWrapper.registerReceiver(ContextWrapper.java:495)
    at com.vidame.HelperClasses.Bluetooth.registerBluetoothBroadcast(Bluetooth.java:83)
    at com.vidame.Activities.BloodPressureActivity$2.onClick(BloodPressureActivity.java:119)
    at android.view.View.performClick(View.java:4789)
    at android.view.View$PerformClick.run(View.java:19881)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5292)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:699)
我在onDestroy()和onStop()中注销它

现在在Bluetooth.class中,我的广播接收器

 public void registerBluetoothBroadcast (Activity parent, DeviceListAdapter mAdapter, ArrayList<BluetoothDevice> list, ProgressDialog mProgressDlg, ListView mListView){
    this.activity=parent;
    this.mAdapter=mAdapter;
    this.list=list;
    this.mProgressDlg=mProgressDlg;
    this.mListView=mListView;

    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    //filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
    activity.registerReceiver(mPairReceiver, filter);
}


public final BroadcastReceiver mPairReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
            final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR);

            if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) {
                ShowMessage("Paired");
            } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){
                ShowMessage("Unpaired");
            }
            mAdapter.notifyDataSetChanged();
        }else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            list = new ArrayList<>();
            mProgressDlg.show();
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            mProgressDlg.dismiss();
            showDevicesList(list);
        } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            list.add(device);
            ShowMessage("Found device " + device.getName());
        }
    }
};

public void unRegisterReceiver(){
    if(mPairReceiver!=null){
        LocalBroadcastManager.getInstance(activity).unregisterReceiver(mPairReceiver);
    }
}
public void registerBluetoothBroadcast(活动父级、DeviceListAdapter mAdapter、ArrayList、ProgressDialog mProgressDlg、ListView mListView){
这个。活动=家长;
this.mAdapter=mAdapter;
this.list=list;
这个.mProgressDlg=mProgressDlg;
this.mListView=mListView;
IntentFilter=newintentfilter();
filter.addAction(BluetoothAdapter.ACTION\u STATE\u已更改);
filter.addAction(找到BluetoothDevice.ACTION);
filter.addAction(BluetoothAdapter.ACTION\u DISCOVERY\u已启动);
filter.addAction(BluetoothAdapter.ACTION\u DISCOVERY\u FINISHED);
//filter.addAction(BluetoothDevice.ACTION\u BOND\u STATE\u已更改);
activity.registerReceiver(mPairReceiver,filter);
}
public final BroadcastReceiver mPairReceiver=新的BroadcastReceiver(){
公共void onReceive(上下文、意图){
String action=intent.getAction();
if(蓝牙设备。动作\键\状态\更改。等于(动作)){
final int state=intent.getIntExtra(BluetoothDevice.EXTRA\u BOND\u state,BluetoothDevice.ERROR);
final int prevState=intent.getIntExtra(BluetoothDevice.EXTRA\u PREVIOUS\u BOND\u STATE,BluetoothDevice.ERROR);
if(state==BluetoothDevice.BOND\u BONDING&&prevState==BluetoothDevice.BOND\u BONDING){
ShowMessage(“配对”);
}else if(state==BluetoothDevice.BOND\u NONE&&prevState==BluetoothDevice.BOND\u BOND){
ShowMessage(“未配对”);
}
mAdapter.notifyDataSetChanged();
}else if(BluetoothAdapter.ACTION\u DISCOVERY\u STARTED.equals(ACTION)){
列表=新的ArrayList();
mProgressDlg.show();
}else if(BluetoothAdapter.ACTION\u DISCOVERY\u FINISHED.equals(ACTION)){
mProgressDlg.disclose();
显示设备列表(列表);
}else if(BluetoothDevice.ACTION_FOUND.equals(ACTION)){
BluetoothDevice=intent.getParcelableExtra(BluetoothDevice.EXTRA\u设备);
列表。添加(设备);
ShowMessage(“找到设备”+device.getName());
}
}
};
公共无效取消注册接收人(){
如果(mPairReceiver!=null){
LocalBroadcastManager.getInstance(活动).unregisterReceiver(MPAIReceiver);
}
}

取消注册接收器是否有我遗漏的地方?

您将在
onDestroy()
onStop()中取消注册两次。
如果要在onCreate方法中注册广播,则必须在
onDestroy
中注销广播,如果要在
onStart
中注册广播,则必须在
onStop
中注销广播。 在您的情况下,您正在clickListener中注册广播,因此,如果用户未单击此按钮,则广播将不会注册,您将尝试在注册后注销它。因此,如果广播已注册,则必须进行测试。 我建议您添加一个布尔属性,当用户单击此按钮时,您将此属性设置为
true
,一旦您进入
onDestroy
,您将测试此布尔属性,如果它为true,您将注销广播

devices_list.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            bluetooth.registerBluetoothBroadcast(BloodPressureActivity.this, mAdapter, list, mProgressDlg, mListView);
            registred = true;
            device_find.setVisibility(View.GONE);
            devices_list.setVisibility(View.GONE);
            list_view.setVisibility(View.VISIBLE);
            bluetooth.bAdapter().startDiscovery();
        }
    });

onDestroy{
...//your code
if(registred){
unregisterBroadcast(your broadcast);
}

}

注销时,需要传递上下文,并使用该上下文注销。蓝牙。取消注册接收器(此);删除顶部的
功能。您的接收器已注销两次。我在Bluetooth.class中创建时正在传递我的活动上下文,如
Bluetooth.setActivity(BloodPressureActivity.this)。是
LocalBroadcastManager.getInstance(activity.unregisterReceiver)的活动值
在我注销Bluetooth.class的过程中,请检查此项,可能问题与您的类似。。。如果这没有帮助的话:按钮点击的频率是多少。i、 你多久注册一次接收者?如果单击三次并注销两次,则这可能是错误的原因。另一个想法是:如果让接收器静止会发生什么?看还是给我同样的错误!我已在注销接收器之前签入onDestroy和onPause,并在再次注册之前签入onResume。
 public void registerBluetoothBroadcast (Activity parent, DeviceListAdapter mAdapter, ArrayList<BluetoothDevice> list, ProgressDialog mProgressDlg, ListView mListView){
    this.activity=parent;
    this.mAdapter=mAdapter;
    this.list=list;
    this.mProgressDlg=mProgressDlg;
    this.mListView=mListView;

    IntentFilter filter = new IntentFilter();
    filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
    filter.addAction(BluetoothDevice.ACTION_FOUND);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
    filter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
    //filter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
    activity.registerReceiver(mPairReceiver, filter);
}


public final BroadcastReceiver mPairReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();

        if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            final int state = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE, BluetoothDevice.ERROR);
            final int prevState = intent.getIntExtra(BluetoothDevice.EXTRA_PREVIOUS_BOND_STATE, BluetoothDevice.ERROR);

            if (state == BluetoothDevice.BOND_BONDED && prevState == BluetoothDevice.BOND_BONDING) {
                ShowMessage("Paired");
            } else if (state == BluetoothDevice.BOND_NONE && prevState == BluetoothDevice.BOND_BONDED){
                ShowMessage("Unpaired");
            }
            mAdapter.notifyDataSetChanged();
        }else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
            list = new ArrayList<>();
            mProgressDlg.show();
        } else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
            mProgressDlg.dismiss();
            showDevicesList(list);
        } else if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
            list.add(device);
            ShowMessage("Found device " + device.getName());
        }
    }
};

public void unRegisterReceiver(){
    if(mPairReceiver!=null){
        LocalBroadcastManager.getInstance(activity).unregisterReceiver(mPairReceiver);
    }
}
devices_list.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            bluetooth.registerBluetoothBroadcast(BloodPressureActivity.this, mAdapter, list, mProgressDlg, mListView);
            registred = true;
            device_find.setVisibility(View.GONE);
            devices_list.setVisibility(View.GONE);
            list_view.setVisibility(View.VISIBLE);
            bluetooth.bAdapter().startDiscovery();
        }
    });

onDestroy{
...//your code
if(registred){
unregisterBroadcast(your broadcast);
}

}