前言:

      上篇学习总结了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 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();        }        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是如何管理事件总线的,以及优缺点。

 

转载于:https://www.cnblogs.com/whoislcj/p/5593056.html

更多相关文章

  1. [Android(安卓)Pro] Android--Sensor传感器
  2. Google Cloud Messaging (Android(安卓)消息推送技术) (一)
  3. Android(安卓)广播监听网络状态
  4. android的消息处理机制(图+源码分析)——Looper,Handler,Message
  5. android 消息机制
  6. Android(安卓)消息机制
  7. Android搜索自动提示功能
  8. android 线程,服务,活动
  9. 我的Android音乐播放器

随机推荐

  1. Android布局文件属性
  2. 解决Android studio升级到3.5的一些问题
  3. Android中SQLite数据库介绍
  4. 温馨提示:Android(安卓)的 XML 文件是是区
  5. Google提供更好的Android应用程序翻译服
  6. 《Android第一行代码》书籍划重点记录
  7. Android中Service概述
  8. Android像素
  9. [置顶] 彻底解决Android 应用方法数不能
  10. 探索 Android 平台的 CameraX