Receiver not registered: ***.***.***.***Activity$Socket 报错处理。
顾名思义:Receiver 未注册,调用unregisterReceiver就会保错
通常出现这个问题有以下情况:
第一种:Receiver真的没有注册,不存在。
第二种:conext.unregisterReceiver和conext.registerReceiver的context不匹配。这个可以在注册之后,调用unregisterReceiver调试以下,一般使用全局的getApplicationContext就行了。
第三种:多次调用unregisterReceiver导致。一次unregisterReceiver,只能调用一次unregisterReceiver
private boolean mReceiverTag = false; //广播接受者标识
private SocketMessageReceiver socketMessageReceiver;
/**
* 动态注册广播
*/
public void doRegisterReceiver() {
if (!mReceiverTag) { //在注册广播接受者的时候 判断是否已被注册,避免重复多次注册广播
socketMessageReceiver = new SocketMessageReceiver();
IntentFilter filter = new IntentFilter("com.xch.servicecallback.content");
mView.registerReceiver(socketMessageReceiver, filter);
mReceiverTag = true; //标识值 赋值为 true 表示广播已被注册
}
}
/**
* 注销广播
*/
public void unRegisterReceiver(){
if (mReceiverTag) { //判断广播是否注册
mView.unregisterReceiver(socketMessageReceiver);
}
}
// 接受webSocket onMessage中定义的广播消息
private class SocketMessageReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String message = intent.getStringExtra("message");
Log.d("Test", "SocketMessageReceiver start");
if (!StringUtil.isNullOrEmpty(message)) {
Log.d("Test", "SocketMessageReceiver--onReceive接收到服务器传来的消息===" + message);
JSONObject result = null;
try {
result = new JSONObject(message);
} catch (JSONException e) {
e.printStackTrace();
}
if (result != null) {
if (result.has("webSocketConn")) {
// socket 下发的消息
}else if (result.has("status")){
String status = "";
try {
status = result.getString("status");
} catch (JSONException e) {
e.printStackTrace();
}
}
}
}
}
}
注意:动态注册的广播,结束activity的时候一定要注销广播。即:registerReceiver 和 unregisterReceiver 成对存在。如果只注册,不注销,未回收的BroadcastReceiver可能引起内存泄漏。