平常我们开发的时候需要使用到动态注册广播,如果在一个类内注册很多的广播代码就会既冗余又乱糟糟的,就像这样:
msgReceiver = new NewMessageBroadcastReceiver();IntentFilter intentFilter = new IntentFilter(EMChatManager.getInstance().getNewMessageBroadcastAction());registerReceiver(msgReceiver, intentFilter);IntentFilter ackMessageIntentFilter = new IntentFilter(EMChatManager.getInstance().getAckMessageBroadcastAction());registerReceiver(ackMessageReceiver, ackMessageIntentFilter);IntentFilter cmdMessageIntentFilter = new IntentFilter(EMChatManager.getInstance().getCmdMessageBroadcastAction());registerReceiver(cmdMessageReceiver, cmdMessageIntentFilter);
newMessageBroadcastReceiver = new NewMessageTipBroadcastReceiver();IntentFilter filter = new IntentFilter(StringConstants.NewMessageBroadcastReceiver);filter.addCategory(Intent.CATEGORY_DEFAULT);registerReceiver(newMessageBroadcastReceiver, filter);disTipBroadcastReceiver = new DisTipBroadcastReceiver();filter = new IntentFilter(StringConstants.DisTipBroadcastReceiver);filter.addCategory(Intent.CATEGORY_DEFAULT);registerReceiver(disTipBroadcastReceiver, filter);
上面是我们的注册部分,除了我们需要将广播的引用升级为类的成员之外,我们还需要添加解注代码,就像下面这样:
if (newMessageBroadcastReceiver != null) {unregisterReceiver(newMessageBroadcastReceiver);}if (disTipBroadcastReceiver != null) {unregisterReceiver(disTipBroadcastReceiver);}if (mJPushReceiver != null) {unregisterReceiver(mJPushReceiver);}if (newMessageBroadcastReciver != null) {unregisterReceiver(newMessageBroadcastReciver);}if (newTeacherMessageBroadcastReciver != null) {unregisterReceiver(newTeacherMessageBroadcastReciver);}if (newMessageUserCenterBroadcastReciver != null) {unregisterReceiver(newMessageUserCenterBroadcastReciver);}if (mUIRefreshReceiver != null) {unregisterReceiver(mUIRefreshReceiver);}
所以,我们需要一种极为简便的工具来完成这些工作,让我们开发的时候不用去关心那么多不重要的东西:
package com.sahadev.commontools;import java.util.Map;import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.support.v4.util.ArrayMap;/*** 广播注册解注工具* * @author Sahadev**/
public class RegisterReceiverUtils {private static Map<Class<?>, BroadcastReceiver> MAPS = new ArrayMap<Class<?>, BroadcastReceiver>();/*** @param context* @param broadcastReceiverClass* @param action*/public static void registerBroadcastReceiver(Context context, Class<?> broadcastReceiverClass, String action) {IntentFilter filter = new IntentFilter(action);filter.addCategory(Intent.CATEGORY_DEFAULT);try {BroadcastReceiver broadcastReceiver = (BroadcastReceiver) broadcastReceiverClass.newInstance();if (broadcastReceiver != null) {MAPS.put(broadcastReceiverClass, broadcastReceiver);context.registerReceiver(broadcastReceiver, filter);}} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();}}public static void unregisterBroadcastReceiver(Context context, Class<?> broadcastReceiverClass) {BroadcastReceiver broadcastReceiver = MAPS.get(broadcastReceiverClass);context.unregisterReceiver(broadcastReceiver);MAPS.remove(broadcastReceiverClass);}}
上面这个工具只是简单的对注册解注做了简单的封装,如果可以,我们可以开放开启与关闭方法,与Activity这样的组件的创建销毁方法进行关联,以达到我们更简便的目的。