Android消息传递之组件间传递消息
前言:
上篇学习总结了Android通过Handler消息机制实现了工作线程与UI线程之间的通信,今天来学习一下如何实现组件之间的通信。本文依然是为学习EventBus做铺垫,有对比才能进步,今天主要介绍在EventBus出现之前的实现方式,通过Intent方式这里不做介绍。
消息传递相关文章地址:
- Android消息传递之Handler消息机制
- Android消息传递之组件间传递消息
- Android消息传递之EventBus 3.0使用详解
- Android消息传递之基于RxJava实现一个EventBus - RxBus
需求场景:
之前做图片社交App的时候,需要处理一个点赞数据的同步,比如在作品的详情页点赞 需要同时更新列表页该作品的点赞数量。
方式一:通过动态注册BroadcastReceiver
1.)内部定义BroadcastReceiver
//同步数据广播 private BroadcastReceiver dataSynReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.whoislcj.broadcastReceiver.dataSynAction")) { int count = intent.getIntExtra("count", 0); //接下来执行同步操作 } } };
2.)在Activity对应的生命周期注册/解注册 onCreate/onStart/onResume 注册 onDestroy/onStop/onPause 解注册
注册
//同步数据广播 private BroadcastReceiver dataSynReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("com.whoislcj.broadcastReceiver.dataSynAction")) { int count = intent.getIntExtra("count", 0); runOnUiThread(new Runnable() { @Override public void run() { //接下来执行同步操作 } }); } } };
解注册
//解除同步数据广播 private void unRegisterReceiver() { unregisterReceiver(dataSynReceiver); }
3.)在触发数据同步的地方发送消息
Intent intent = new Intent(); intent.setAction("com.whoislcj.broadcastReceiver.dataSynAction");//设置Action intent.setPackage(getPackageName());//设置包名使广播只能被app内接收者接收 intent.putExtra("count", 5);//添加附加信息 sendBroadcast(intent);
4.)分析优缺点
优点:可以设置不同页面接收消息的优秀级,而且也可以采用发送有序广播的方式终止将同步消息发给下一级,同时也可以修改消息传递给下一级。
缺点:广播传递本身是有安全隐患的,需要设置权限,每一个Activity都要定义、注册,解注册广播无形中加大了工作量和维护成本。
方式二:通过自己管理事件监听总线
1.)声明一个数据同步接口
/** * 赞同步接口 */ public interface IDataSynListener { void onDataSyn(int count); }
2.)定义一个单例管理监听总线
public class DataSynManager { private LinkedList<IDataSynListener> autoListeners = new LinkedList();//监听集合 private static DataSynManager mInstance;//单例引用 /** * 获取单例引用 * * @return */ public static DataSynManager getInstance() { if (mInstance == null) { synchronized (DataSynManager.class) { if (mInstance == null) { mInstance = new DataSynManager(); } } } return mInstance; } /** * 添加同步数据监听 */ public void registerDataSynListener(IDataSynListener autoDataListener) { if (autoListeners == null) { autoListeners = new LinkedList<IDataSynListener>(); } if (!autoListeners.contains(autoDataListener)) { autoListeners.add(autoDataListener); } } /** * 移除同步数据监听 */ public void unRegisterDataSynListener(IDataSynListener autoDataListener) { if (autoListeners == null) { return; } if (autoListeners.contains(autoDataListener)) { autoListeners.remove(autoDataListener); } } /** * 执行数据同步 * * @param count */ public void doDataSyn(final int count) { if (autoListeners == null) { autoListeners = new LinkedList(); } new Handler().post(new Runnable() { @Override public void run() { for (IDataSynListener dataSynListener : autoListeners) { dataSynListener.onDataSyn(count); } } }); } /** * 清除所有监听者 */ public void release() { if (autoListeners != null) { autoListeners.clear(); autoListeners = null; } } /** * 赞同步接口 */ public interface IDataSynListener { void onDataSyn(int count); } }
2.)在Activity对应的生命周期添加监听/移除监听 onCreate/onStart/onResume 添加监听 onDestroy/onStop/onPause 移除监听
添加监听
DataSynManager.getInstance().registerDataSynListener(dataSynListener);
移除监听
DataSynManager.getInstance().unRegisterDataSynListener(dataSynListener);
声明一个监听
DataSynManager.IDataSynListener dataSynListener=new DataSynManager.IDataSynListener() { @Override public void onDataSyn(int count) { //接下来执行同步操作 } };
3.)在触发数据同步的地方发送消息
DataSynManager.getInstance().doDataSyn(5);
4.)分析优缺点
优点:相对广播传输安全一点,对于总线数量过大的时候效率可能会比较低。
缺点:不能设置优先级,不能终止传递,不能修改消息。
小结:
以上两种方式是在EventBus出现之前我所使用的实现方式,如果有更好的实现方式,也可以互相学习一下。接下来就是来学习一个EventBus是如何管理事件总线的,以及优缺点。
干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!