【问题】
如下代码:
private final BroadcastReceiver mBtModuleStatusChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int btCurState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
int btPrevState = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, BluetoothAdapter.ERROR);
//int btCurState = intent.getParcelableExtra(BluetoothAdapter.EXTRA_STATE);
//int btPrevState = intent.getParcelableExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE);
CommunicationState prevCommState = btStateToCommState(btPrevState);
CommunicationState curCommState = btStateToCommState(btCurState);
if((CommunicationState.UNKNOWN != prevCommState) && (CommunicationState.UNKNOWN != curCommState)){
//only notify when enable/disable blutooth module
ModuleStatusPara moduleStatePara = new ModuleStatusPara();
moduleStatePara.setCommType(CommunicationType.BLUETOOTH);
moduleStatePara.setPrevState(prevCommState); //ENABLED
moduleStatePara.setCurState(curCommState); //DISABLING
if(null != mModuleStateChanged){
mModuleStateChanged.Execute(this, moduleStatePara, null);
}
}
}
}
};在执行完毕后,返回时,挂掉了,如图:
【折腾过程】
1.折腾了半天,最终结果是:
对于同一个ACTION,多次注册了同一个intentFilter,而导致会挂掉。
去掉后来的第二次的注册,即可。
即,本来通过:
private final BroadcastReceiver mBtModuleStatusChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int btCurState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
int btPrevState = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, BluetoothAdapter.ERROR);
//int btCurState = intent.getParcelableExtra(BluetoothAdapter.EXTRA_STATE);
//int btPrevState = intent.getParcelableExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE);
CommunicationState prevCommState = btStateToCommState(btPrevState);
CommunicationState curCommState = btStateToCommState(btCurState);
if((CommunicationState.UNKNOWN != prevCommState) && (CommunicationState.UNKNOWN != curCommState)){
//only notify when enable/disable blutooth module
ModuleStatusPara moduleStatePara = new ModuleStatusPara();
moduleStatePara.setCommType(CommunicationType.BLUETOOTH);
moduleStatePara.setPrevState(prevCommState); //ENABLED
moduleStatePara.setCurState(curCommState); //DISABLING
if(null != mModuleStateChanged){
mModuleStateChanged.Execute(this, moduleStatePara, null);
}
}
}
}
};
private void listenBluetoothModuleStateChange(){
// Register for broadcasts on BluetoothAdapter state change
IntentFilter btStateChangeFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
AppContext.getInstance().getAppContext().registerReceiver(mBtModuleStatusChangeReceiver, btStateChangeFilter);
}已经对于BluetoothAdapter.ACTION_STATE_CHANGED注册过了。
但是后来又再次注册了一遍(虽然用的不是同一个IntentFilter):
private final BroadcastReceiver mBtAdapterStatusChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int btCurState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
int btPrevState = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, BluetoothAdapter.ERROR);
BluetoothDevice curBtDev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String btDevMacAddr = curBtDev.getAddress();
AdapterState prevAdapterState = btStateToAdapterState(btPrevState);
AdapterState curAdapterState = btStateToAdapterState(btCurState);
if((AdapterState.UNKNOWN != prevAdapterState) && (AdapterState.UNKNOWN != curAdapterState)){
//only notify when blutooth adapter connect/disconnect
AdapterStatePara adapterStatePara = new AdapterStatePara();
adapterStatePara.setCommType(CommunicationType.BLUETOOTH);
adapterStatePara.setAdapterId(btDevMacAddr);
adapterStatePara.setPrevState(prevAdapterState);
adapterStatePara.setCurState(curAdapterState);
if(null != mAdapterStateChanged){
mAdapterStateChanged.Execute(this, adapterStatePara, null);
}
}
}
}
};
// Register for broadcasts on BluetoothAdapter state change
IntentFilter btAdapterStateChangeFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
AppContext.getInstance().getAppContext().registerReceiver(mBtAdapterStatusChangeReceiver, btAdapterStateChangeFilter);然后导致会挂掉。
解决办法是:
去掉后面的第二次的注册,只用单个的IntentFilter去处理BluetoothAdapter.ACTION_STATE_CHANGED就可以了:
private final BroadcastReceiver mBtModuleStatusChangeReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
if (action.equals(BluetoothAdapter.ACTION_STATE_CHANGED)) {
int btCurState = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, BluetoothAdapter.ERROR);
int btPrevState = intent.getIntExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE, BluetoothAdapter.ERROR);
if(null != mModuleStateChanged){
//int btCurState = intent.getParcelableExtra(BluetoothAdapter.EXTRA_STATE);
//int btPrevState = intent.getParcelableExtra(BluetoothAdapter.EXTRA_PREVIOUS_STATE);
CommunicationState prevCommState = btStateToCommState(btPrevState);
CommunicationState curCommState = btStateToCommState(btCurState);
if((CommunicationState.UNKNOWN != prevCommState) && (CommunicationState.UNKNOWN != curCommState)){
//only notify when enable/disable blutooth module
ModuleStatusPara moduleStatePara = new ModuleStatusPara();
moduleStatePara.setCommType(CommunicationType.BLUETOOTH);
moduleStatePara.setPrevState(prevCommState); //ENABLED
moduleStatePara.setCurState(curCommState); //DISABLING
mModuleStateChanged.Execute(this, moduleStatePara, null);
}
}
if(null != mAdapterStateChanged){
BluetoothDevice curBtDev = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
String btDevMacAddr = curBtDev.getAddress();
AdapterState prevAdapterState = btStateToAdapterState(btPrevState);
AdapterState curAdapterState = btStateToAdapterState(btCurState);
if((AdapterState.UNKNOWN != prevAdapterState) && (AdapterState.UNKNOWN != curAdapterState)){
//only notify when blutooth adapter connect/disconnect
AdapterStatePara adapterStatePara = new AdapterStatePara();
adapterStatePara.setCommType(CommunicationType.BLUETOOTH);
adapterStatePara.setAdapterId(btDevMacAddr);
adapterStatePara.setPrevState(prevAdapterState);
adapterStatePara.setCurState(curAdapterState);
mAdapterStateChanged.Execute(this, adapterStatePara, null);
}
}
}
}
};
private void listenBluetoothModuleStateChange(){
// Register for broadcasts on BluetoothAdapter state change
IntentFilter btStateChangeFilter = new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED);
AppContext.getInstance().getAppContext().registerReceiver(mBtModuleStatusChangeReceiver, btStateChangeFilter);
}
【总结】
貌似对于同一个ACTION,比如BluetoothAdapter.ACTION_STATE_CHANGED
是不能多次注册的,否则会挂掉的。
转载请注明:在路上 » 【已解决】BroadcastReceiver的onReceive执行完毕后返回结果出错:LoadedApk$ReceiverDispatcher$Args.run