[英]Unregistering Broadcast Receiver error
我想在我的 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)
我在Bluetooth.java类中有我的broadcast receiver
方法以及我在我的应用程序中使用的其他有用方法,并在BloodPressureActivity
调用它。 下面我有这两个类的代码
这是我在BloodPressureActivity
注册接收器的BloodPressureActivity
devices_list.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
bluetooth.registerBluetoothBroadcast(BloodPressureActivity.this, mAdapter, list, mProgressDlg, mListView);
device_find.setVisibility(View.GONE);
devices_list.setVisibility(View.GONE);
list_view.setVisibility(View.VISIBLE);
bluetooth.bAdapter().startDiscovery();
}
});
我在 onDestroy() 和 onStop() 中取消注册
@Override
public void onDestroy() {
bluetooth.unRegisterReceiver();
super.onDestroy();
}
@Override
protected void onStop() {
bluetooth.unRegisterReceiver();
super.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);
}
}
关于未注册的接收器,我有什么遗漏吗?
您在onDestroy()
和onStop()
中注销了两次。 如果您在 onCreate 方法中注册广播,则必须在onDestroy
取消注册;如果在onStart
中注册,则必须在onStop
取消注册。 在您的情况下,您正在 clickListener 中注册广播,因此如果用户没有单击此按钮,则广播未注册,您将在此之后尝试取消注册。 所以如果广播被注册,你必须做一个测试。 我建议你添加一个布尔属性,当用户点击这个按钮时,你在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);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.