Android应用模块之间通信模式

Android应用程序开发中通常需要多个模块进行通信(相互调用),如果不注意避免耦合,未来功能扩展以及调整会使得代码十分混乱,容易发生错误,并且维护困难。例如,Fragment直接通过(MainActivity)getActivity()的方式来使用其公共成员方法,Fragment和MainActivity之间紧耦合。

1 public class FragmentPage{
2      ...
3      public void onClick(View v){
4           ...
5           (MainActivity) getActivity().switchTab(MainActivity.RECOMMEND_TAB);
6           ...
7      }
8 }
9  

首先来看常见的几种耦合类型:

1 简单数据参数耦合。两个模块之间仅仅使用基本数据类型来传递信息,这通常来说是可接受的。

2 简单对象耦合。指一个对象创建了另一个对象。在一般情况下这么做没有问题,但在某些情况下,如单元测试需要配置网络对象,这就需要依赖注入来解决问题。

3 语义耦合。指模块不是以接口的方式直接操作另一个模块。例如上面提到的例子,Fragment将一个Activity引用转换为其子类来使用。我们应尽量避免语义耦合。

那么如何避免紧耦合呢?

首先可以通过第一接口的方式,让其他类通过接口的方式与其通讯。

public class FragmentPage{
     private TabSwitcher mTabSwitcher;
     ...

     public FragmentPage(TabSwitcher switcher){
          mTabSwitcher = switcher;
     }

     public void onClick(View v){
          ...
          mTabSwitcher (TabSwitcher.RECOMMEND_TAB);
          ...
     }
}

在大型Android应用开发中,我们可能需要通知多个类某个事件的发生,如果单纯通过接口的方式实现,将会产生大量的接口,并且需要维护消息接受者队列,增加程序复杂度。因此我们需要能够管理订阅-发布关系的方案:MessageBus。这种沟通方式是基于订阅-发布设计模式,发布者可以发布消息,是的订阅了该消息的类或模块得到通知,使得两者完全的分离。

Android提供了广播的方式,使得Intent可以在不同的应用程序之间传递。但是在传递复杂的数据对象时,需要通过实现Serializable或Parcelable接口。当前更流行是使用基于事件的MessageBus,支持自定义事件。相关的EventBus有greenrobot EventBussquare otto

参考资料:http://vinsol.com/blog/2014/11/04/communication-patterns-for-application-components/

时间: 2024-10-10 14:25:56

Android应用模块之间通信模式的相关文章

Prism学习笔记-模块之间通信的几种方式

在开发大型复杂系统时,我们通常会按功能将系统分成很多模块,这样模块就可以独立的并行开发.测试.部署.修改.使用Prism框架设计表现层时,我们也会遵循这个原则,按功能相关性将界面划分为多个模块,每个模块又包含多个Region.这就需要解决模块之间.Region之间经常需要进行通信的问题,Prism提供了以下几种方式: 1.聚合事件(Event aggregation) 使用方式,先在一个公共模块中定义一个事件MyEvent ,传输数据为MyEntity. public class MyEvent

【Android翻译】组件通信模式

目标:避免紧耦合 本文对原文进行了精简 原文链接:Communication patterns for application components 紧耦合 组件之间相互持有引用,以及直接调用方法.在下面的代码中,MenuFragment持有MagazineActivity的直接引用,因此, MenuFragment 就与 MagazineActivity紧耦合了. 一旦没有了MagazineActivity,就无法工作了. // 紧耦合示例 class MenuFragment extends

Android中Activity之间通信

一.使用Intent 在 Android 中,不同的 Activity 实例可能运行在一个进程中,也可能运行在不同的进程中.因此我们需要一种特别的机制帮助我们在 Activity 之间传递消息.Android 中通过 Intent 对象来表示一条消息,一个 Intent 对象不仅包含有这个消息的目的地,还可以包含消息的内容,这好比一封 Email,其中不仅应该包含收件地址,还可以包含具体的内容.对于一个 Intent 对象,消息“目的地”是必须的,而内容则是可选项. 在上面的实例中通过 Acti

插件模块与模块之间的通信(转)

插件模块与模块之间的通信 在这里做个代码备注 防止下次忘记...using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Reflection; using System.Windows; using System.Windows.Controls; using System.Windows.Forms; using MessageBox = System.Wi

Prism 4 文档 ---第9章 松耦合组件之间通信

当构建一个大而负责的应用程序时,通用的做法时将功能拆分到离散的模块程序集中.将模块之间的静态引用最小化.这使得模块可以被独立的开发,测试,部署和升级,以及它迫使松散耦合的沟通. 当在模块之间通信时,你需要知道不同通信方式之间的区别,那样你才能确定哪种方式对于你的特定的场景最合适,Prism类库提供了以下几种通信方式: 命令.当希望对于用户的交互马上采取动作时使用. 事件聚合.用于ViewModel,展现层,或者控制之间没有所期望的直接动作时. 区域上下文.使用它可以提供宿主和宿主区域的View之

(转载) Android两个子线程之间通信

Android两个子线程之间通信 标签: classthreadandroid子线程通信 2015-03-20 17:03 3239人阅读 评论(0) 收藏 举报  分类: 个人杂谈 版权声明:本文为博主原创文章,未经博主允许不得转载. Android中,相信主线程和子线程之间的通信大家都不陌生了吧.在一次面试经历中被问到了两个子线程之间是如何进行通信的.哎呦!这可蒙住我了.后来回家研究了下,分享给大家. 其实android中线程通信无非就是handler和looper的操作. 一般情况下的主线

【转】android蓝牙开发---与蓝牙模块进行通信--不错

原文网址:http://www.cnblogs.com/wenjiang/p/3200138.html 近半个月来一直在搞android蓝牙这方面,主要是项目需要与蓝牙模块进行通信.开头的进展很顺利,但因为蓝牙模块不在我这里,所以只能用手机测试.一开头就发现手机的蓝牙不能用,为了证明这点,我刷了四次不同不同系统的官方包,正式宣布手机的蓝牙报销了,于是和朋友换手机.在测试的过程中也是非常痛苦,放假了,同学都几乎回家了,剩下的同学中竟然80%都是用非android手机!我和我的小伙伴都吓呆了!!就算

Android中子线程和UI线程之间通信的方式

Android中子线程和UI线程之间通信的详细解释 1.在多线程编程这块,我们经常要使用Handler,Thread和Runnable这三个类,那么他们之间的关系你是否弄清楚了呢?下面详解一下. 2.首先在开发Android应用时必须遵守单线程模型的原则: Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行. 3.Handler: (1).概念: Handler是沟通Activity 与Thread/runnable的桥梁.而Handler是运行在主UI线程中的,它与子线程

Android WIFI模块分析

一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标准的,但WIFI不等同无线网络. 二:Android平台下的WIFI模块 简单介绍一下,WIFI模块的基本功能: 1. 开关WIFI 除了在WIFI设置界面可以开关WIFI,还有其他的方法可以设置,要查看这些开关状态是否一致.还有就是飞行模式对WIFI开关的影响,由于WIFI开和关都有一个时间过程,