前言:

上篇学习总结了Android通过Handler消息机制实现了工作线程与UI线程之间的通信,今天来学习一下如何实现组件之间的通信。本文依然是为学习EventBus做铺垫,有对比才能进步,今天主要介绍在EventBus出现之前的实现方式,通过Intent方式这里不做介绍。

消息传递相关文章地址:

需求场景:

之前做图片社交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是如何管理事件总线的,以及优缺点。

Android消息传递之组件间传递消息的更多相关文章

  1. 解决SpannableString在Android组件间传递时显示失效的问题

    问题:在A activity中传递一个SpannableString到B activity中,并最终传递到B activity中的TextView中,但是没有展示出Span效果. 解决:阅读TextV ...

  2. Android程序中Acticity间传递数据

    在Android开发过程中,在不同的Acitivity之间传递数据的情况是非常常见的.我花费了一点时间来总结Acitivity之间的数据传递,记录下来. 1.简单传递键值对 这种传递方式非常简单,只需 ...

  3. [Android Pro] AIDL进程间传递自定义类型参数

    1.创建.aidl 文件 AIDL 语法简单,用来声明接口,其中的方法接收参数和返回值,但是参数和返回值的类型是有约束的,且有些类型是需要 import,另外一些则无需这样做. AIDL 支持的数据类 ...

  4. VC消息传递(对话框间传递参数)

    以下用一个自创的对话框类(MyMessageDlg)向视图类(MessageTestView)发送自定义消息为例,说明这两种不同方法的自定义消息的 消息传递的方法一:使用ON_MESSAGE使用ON_ ...

  5. 四大组件之Activity——组件间传递数据的4种常用方法

    在Android中传递数据的方法非常多,本次介绍4中比较常用的数据传递方法: 通过Intent/Bundle传递数据 通过静态变量(static)传递数据:需构建跳转页面相应静态变量http://bl ...

  6. APP间传递消息

    https://www.jianshu.com/p/d640ccfcea5f 1: URL Scheme 常用的App间传值方式.常见于分享等. 2: Keychain  借助系统类 Keychain ...

  7. Android消息传递之Handler消息机制

    前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...

  8. Android消息传递之基于RxJava实现一个EventBus - RxBus

    前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...

  9. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

随机推荐

  1. 从RPC开始(一)

    这是一篇关于纯C++RPC框架的文章.所以,我们先看看,我们有什么? 1.一个什么都能干的C++.(前提是,你什么都干了) 2.原始的Socket接口,还是C API.还得自己去二次封装... 3.C ...

  2. Java基础Map接口+Collections

    1.Map中我们主要讲两个接口 HashMap  与   LinkedHashMap (1)其中LinkedHashMap是有序的  怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...

  3. iOS开源项目周报0105

    由OpenDigg 出品的iOS开源项目周报第四期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. He ...

  4. 基于fis3的组件可视化道路

    首先说明一下,即使不熟悉fis3,阅读文本应该也会有所收获. 本文以fis-parser-imweb-tplv2插件为模板插件,目的不在于使用哪个模板,而是组件可视化的实现思路,不必担心. 先说说模板 ...

  5. c#比较两个数组的差异

    将DataTable中某一列数据直接转换成数组进行比较,使用的Linq,要引用命名空间using System.Linq; string[] arrRate = dtRate.AsEnumerable ...

  6. ABP项目中使用Swagger生成动态WebAPI

    本文是根据角落的白板报的<使用ABP实现SwaggerUI,生成动态webapi>一文的学习总结,感谢原文作者角落的白板报. 1 安装Swashbuckle.core 1.1 选择WebA ...

  7. Android(安卓)-------CardView

    1.activity_main.xml <android.support.v7.widget.CardView android:id="@+id/cardView" andr ...

  8. 如何使用dos命令打开当前用户、当前日期、当前时间以及当前用户加当前时间?

    1.dos命令安装mysqld --stall.启动net start mysql.进入MySQL数据库mysql -uroot -p后,输入select user();当前用户 select cur ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

  10. ucos实时操作系统学习笔记——任务间通信(消息)

    ucos另一种任务间通信的机制是消息(mbox),个人感觉是它是queue中只有一个信息的特殊情况,从代码中可以很清楚的看到,因为之前有关于queue的学习笔记,所以一并讲一下mbox.为什么有了qu ...