前言:

      上篇学习总结了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 数据备份恢复的一种实现
  2. Android开发实践 数据存储 学习、应用、总结
  3. Android studio 通过以servlet搭建的服务器访问 PC端 mysql数据
  4. Google Cloud Messaging (Android 消息推送技术) (一)
  5. Android ADT,SDK的安装,让人烦恼的在线方式!

随机推荐

  1. crmeb pro单商户前端uniapp编译打包公众
  2. i7 1165g7和r7 5800u 差距大吗 ii7 1165g
  3. 二叉树及存储结构
  4. i5 9400f配什么主板性能最好 i5 9400f配
  5. rtx3080和rtx3080ti性能差距 rtx3080和rt
  6. i5 9400f和r5 3500x游戏性能哪个好
  7. Go语言基础之网络编程
  8. rtx3090和rtx3080ti性能差距 rtx3090和r
  9. Go语言基础之包
  10. crmeb pro单商户前台uniapp修改编译打包