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到底是不是最佳方案?学习 ...
随机推荐
- 十分钟介绍mobx与react
原文地址:https://mobxjs.github.io/mobx/getting-started.html 写在前面:本人英语水平有限,主要是写给自己看的,若有哪位同学看到了有问题的地方,请为我指 ...
- Mono为何能跨平台?聊聊CIL(MSIL)
前言: 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇.到底是什么原理使得U3D可以跨平台呢?后来发现了Mono的作用,并进一步了解到了CIL的存在.所以,作为一个对Unity3D跨平台能力 ...
- [WCF]缺少一行代码引发的血案
这是今天作项目支持的发现的一个关于WCF的问题,虽然最终我只是添加了一行代码就解决了这个问题,但是整个纠错过程是痛苦的,甚至最终发现这个问题都具有偶然性.具体来说,这是一个关于如何自动为服务接口(契约 ...
- Ajax使用WCF实现小票pos机打印源码
通过ajax跨域方式调用WCF服务,实现小票pos机的打印,源码提供web方式,客户端方式测试,服务驻留右侧底部任务栏,可控制服务开启暂停,用户可自定义小票打印模板,配合零售录入. qq 22945 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- HTML学习笔记
HTML学习笔记 2016年12月15日整理 Chapter1 URL(scheme://host.domain:port/path/filename) scheme: 定义因特网服务的类型,常见的为 ...
- Android 算法 关于递归和二分法的小算法
// 1. 实现一个函数,在一个有序整型数组中二分查找出指定的值,找到则返回该值的位置,找不到返回 -1. package demo; public class Mytest { public st ...
- Android 旋转屏幕--处理Activity与AsyncTask的最佳解决方案
一.概述 运行时变更就是设备在运行时发生变化(例如屏幕旋转.键盘可用性及语言).发生这些变化,Android会重启Activity,这时就需要保存activity的状态及与activity相关的任务, ...
- Android studio使用git教程
①下载Git工具,配置到Android studio中 http://git-scm.com/downloads ------------------------------------------- ...
- SpringMVC(关于HandlerMapping执行流程原理分析)
请求过来先碰见中央调度器(前端调度器) //Determine handler for the current request; 对当前请求决定交给哪个handler, 当前请求地址过来 处理器执行链 ...