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是如何管理事件总线的,以及优缺点。
Android消息传递之组件间传递消息的更多相关文章
- 解决SpannableString在Android组件间传递时显示失效的问题
问题:在A activity中传递一个SpannableString到B activity中,并最终传递到B activity中的TextView中,但是没有展示出Span效果. 解决:阅读TextV ...
- Android程序中Acticity间传递数据
在Android开发过程中,在不同的Acitivity之间传递数据的情况是非常常见的.我花费了一点时间来总结Acitivity之间的数据传递,记录下来. 1.简单传递键值对 这种传递方式非常简单,只需 ...
- [Android Pro] AIDL进程间传递自定义类型参数
1.创建.aidl 文件 AIDL 语法简单,用来声明接口,其中的方法接收参数和返回值,但是参数和返回值的类型是有约束的,且有些类型是需要 import,另外一些则无需这样做. AIDL 支持的数据类 ...
- VC消息传递(对话框间传递参数)
以下用一个自创的对话框类(MyMessageDlg)向视图类(MessageTestView)发送自定义消息为例,说明这两种不同方法的自定义消息的 消息传递的方法一:使用ON_MESSAGE使用ON_ ...
- 四大组件之Activity——组件间传递数据的4种常用方法
在Android中传递数据的方法非常多,本次介绍4中比较常用的数据传递方法: 通过Intent/Bundle传递数据 通过静态变量(static)传递数据:需构建跳转页面相应静态变量http://bl ...
- APP间传递消息
https://www.jianshu.com/p/d640ccfcea5f 1: URL Scheme 常用的App间传值方式.常见于分享等. 2: Keychain 借助系统类 Keychain ...
- Android消息传递之Handler消息机制
前言: 无论是现在所做的项目还是以前的项目中,都会遇见线程之间通信.组件之间通信,目前统一采用EventBus来做处理,在总结学习EventBus之前,觉得还是需要学习总结一下最初的实现方式,也算是不 ...
- Android消息传递之基于RxJava实现一个EventBus - RxBus
前言: 上篇文章学习了Android事件总线管理开源框架EventBus,EventBus的出现大大降低了开发成本以及开发难度,今天我们就利用目前大红大紫的RxJava来实现一下类似EventBus事 ...
- Android消息传递之EventBus 3.0使用详解
前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...
随机推荐
- NodeJs之child_process
一.child_process child_process是NodeJs的重要模块.帮助我们创建多进程任务,更好的利用了计算机的多核性能. 当然也支持线程间的通信. 二.child_process的几 ...
- DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享
DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...
- (JS+CSS)实现图片放大效果
代码很简单,在这里就不过多阐述,先上示例图: 实现过程: html部分代码很简单 <div id="outer"> <p>点击图片</p> &l ...
- junit4进行单元测试
一.前言 提供服务的时候,为了保证服务的正确性,有时候需要编写测试类验证其正确性和可用性.以前的做法都是自己简单写一个控制层,然后在控制层里调用服务并测试,这样做虽然能够达到测试的目的,但是太不专业了 ...
- 前端制作动画的几种方式(css3,js)
制作动态的网页是是前端工程师必备的技能,很好的实现动画能够极大的提高用户体验,增强交互效果,那么动画有多少实现方式,一直对此有选择恐惧症的我就总结一下,以便在开发的时候选择最好的实现方式. 1.css ...
- 深入浅出Redis-redis哨兵集群
1.Sentinel 哨兵 Sentinel(哨兵)是Redis 的高可用性解决方案:由一个或多个Sentinel 实例 组成的Sentinel 系统可以监视任意多个主服务器,以及这些主服务器属下的所 ...
- 接口--interface
“interface”(接口)关键字使抽象的概念更深入了一层.我们可将其想象为一个“纯”抽象类.它允许创建者规定一个类的基本形式:方法名.自变量列表以及返回类型,但不规定方法主体.接口也包含了基本数据 ...
- ASP.NET Core 中文文档目录
翻译计划 五月中旬 .NET Core RC2 如期发布,我们遂决定翻译 ASP.NET Core 文档.我们在 何镇汐先生. 悲梦先生. 张仁建先生和 雷欧纳德先生的群中发布了翻译计划招募信息,并召 ...
- IT运维监控解决方案介绍
现状 •小公司/ 创业团队< 500台服务器规模 开源方案:Zabbix.Nagios.Cacti- 云服务提供商:监控宝.oneAlert等 •BAT级别> 10万台服务器 投 ...
- JavaScript对象和数组
1.JavaScript中有两个非常重要的数据类型是对象和数组. 通过"."或者"[]"来访问对象属性 举例:var book = { topic:" ...