在前面写Android的ContentProvider时候,可以看到那是基于观察者模式的一个消息传递方法。每一个Cursor、ContentResolver做为一个小的注册中心,相关观察者可以在这个中心注册,更新消息由注册中心分发给各个观察者。而在MFC或Winform中,都会形成一个消息网,让消息在网中流动,被各节点使用、吃掉或者在出口死掉。
相比之下,我个人觉得基于Intent的Android核心消息传递机制是有所不同的。它应该会有一个全局性的注册中心,这个注册中心是隐性的,整个Android系统中就那么一个。所有的消息接收者,都被隐形的注册到这个中心。包括Activity,Service和IntentReceiver。其实说隐形注册是不确切的,所有注册都还是我们手动告诉注册中心的,只是与传统的方式不一样,我们通常不是通过代码,而是通过配置文件来做。在应用的Manifest中,我们会为一些Activity或Service添加上Intent-filter,或在配置文件中添加<receiver></receiver>项。这其实就相当于向系统的注册中心,注册了相关的Intent-filter和receiver(这个事情完全可以通过代码来做,只是这样就失去了修改的灵活性)。
当程序有一个消息希望发出去的时候,它需要将消息封装成一个Intent,并发送。这时候,应该是有一个统一的中心(恩,有可能Android底层实现的时候不是,但简单这样看是没问题的...)接受到这个消息,并对它进行解析、判定消息类型(这个步骤降低了耦合...),然后检查注册了相匹配的filter或receiver,并创建或唤醒接收者,将消息分发给它。这样做有很多好处。虽然这种传递有的时候不如点对点的传递快(这有些需要速度的地方,我们看到Android会通过直接通信来做),但有时候又因为它只经过一跳(姑且这么叫吧...),比复杂的流动又要更快。更重要的是,它耦合性低,在手机平台这种程序组件多变的条件下使用十分适合。并且它可以很容易实现消息的精确或模糊匹配,弹性很大。(我个人曾想在开发一个C++二次平台的时候引入这样的机制,但在C++中,建立一套完整的数据marshal机制不容易,相比之下,用java来做会简单很多...)
恩,废话说了很多,具体讲讲Android中Intent的使用。当你有一个消息需要传递,如果你明确知道你需要哪个Activity或者其他Class来响应的话,你可以指定这个类来接受该消息,这被称为显性发送。你需要将Intent的class属性设置成目标。这种情况很常见,比如startActivity的时候,会清楚当前Activity完了应该是哪个Activity,那就明确的发送这个消息。

但是,有的时候你并不确定你的消息是需要具体哪个类来执行,而只是知道接收者该符合哪些条件。比如你只需要有一个接收者能显示用户所选的数据,而不想制定某个具体的方法,这时候你就需要用到隐形发送(传统上,我们可能会考虑用多态,但显然这种方式更为灵活...)。在Android中,你可以为Intent指定一个action,表示你这个指令需要处理的事情。系统为我们定义了很多Action类型,这些类型使系统与我们通信的语言(比如在Activity里面加一个Main的filter,该activity就会做成该应用的入口点),当然你也可以用于你自己的应用之间的通信(同样当然,也可以自定义...)。强烈建议,在自己程序接收或发出一个系统action的时候,要名副其实。比如你响应一个view动作,做的确实edit的勾当,你发送一个pick消息,其实你想让别人做edit的事,这样都会造成混乱。当然只有Action有时候是不够的,在Android中我们还可以指定catalog信息和type/data信息,比如所有的显示数据的Activity,可能都会响应View action。但很多与我们需要显示的数据类型不一样,可以加一个type信息,明确的指出我们需要显示的数据类型,甚至还可以加上一个catalog信息,指明只有你只有按的是“中键”并发出这样的消息才响应。
从上面可以看出,Android的Intent可以添加上class, action, data/type, catalog等消息,注册中心会根据这些信息帮你找到符合的接收者。其中class是点对点的指示,一旦指明,其他信息都被忽略。Intent中还可以添加key/value的数据,发送方和接收方需要保持统一的key信息和value类型信息,这种数据的marshal在java里做,是不费什么力气的。
Android的Intent发送,可以分成单播和广播两种。广播的接收者是所有注册了的符合条件的IntentReceiver。在单播的情况下,即使有很多符合条件的接收者,也只要有一个出来处理这个消息就好(恩,个人看法,没找到确切条款或抉择的算法,本来想实验一下,没来得及...),这样的情况很容易理解,当你需要修改某个数据的时候,你肯定不会希望有十个编辑器轮流让你来处理。当广播不是这样,一个receiver没有办法阻止其他receiver进行对广播事件的处理。这种情况也很容易理解,比如时钟改变了,闹钟、备忘录等很多程序都需要分别进行处理。在自己的程序的使用中,应该分清楚区别,合理的使用。

转载于:https://www.cnblogs.com/duguguiyu/archive/2007/11/30/977665.html

Study on Android【三】--Intent消息传递相关推荐

  1. Android 意图(Intent)

    写在前面 Android中,意图(Intent)是一个消息传递对象,活动.服务和广播接收器之间调用和消息传递都是通过意图实现的.意图的三个基本的用途为:启动Activity.启动Service和传递广 ...

  2. Android中Intent传递对象的两种方法(Serializable,Parcelable)

    这篇文章转自博客园 Android中Intent中如何传递对象,就我目前所知道的有两种方法,一种是Bundle.putSerializable(Key,Object);另一种是Bundle.putPa ...

  3. 3.1 Android组件intent filter

    3.1.0 Intent filter基本概念 前面章节我们说到了Intent,Intent对象中除了ComponentName可以直接指定目标组件外,其它的属性都无法直接指定目标组件.当然我们这里不 ...

  4. 【Android】 Intent应用详解

    转载:http://blog.csdn.net/liuhe688/article/details/7162988 看似尋常最奇崛,成如容易卻艱辛.北宋.王安石 看似普通的事情其实最不同寻常,并不是简简 ...

  5. Android的intent之间复杂参数的传递

    2019独角兽企业重金招聘Python工程师标准>>> Intent是Activity与Activity之间,Activity与Service之间传递参数的介质 Intent传递的参 ...

  6. android之Intent的七大属性

    Intent用于封装程序的"调用意图".两个Activity之间,可以把需要交换的数据,封装成Bundle对象,然后使用Intent对象,携带数据到另一个Activity中.实现两 ...

  7. Android 意图(Intent)和过滤器(Filter)

    Android意图是一个要执行的操作的抽象描述.它可以通过 startActivity 来启动一个活动,broadcastIntent 来发送广播到任何对它感兴趣的广播接受器组件,startServi ...

  8. Android核心 intent基础

    Intent(一简介) 一个安卓程序由多个组件组成,各个组件之间可以使用Intent进行交流.Intent对象包含了组件名称.动作.数据.种类.额外.标记等内容. 组件名称: 组件名称的类是指:Com ...

  9. android集合方法,android中intent传递list或者对象的方法

    本文实例讲述了android中intent传递list或者对象的方法.分享给大家供大家参考.具体实现方法如下: 方法一: 如果单纯的传递List 或者List的话 就可以直接使用 代码如下: inte ...

最新文章

  1. 清除Squid缓存的小工具
  2. Android依赖注入:Google Guice on Android的使用及相关资源
  3. AcWing算法基础课 Level-2 第三讲 搜索与图论
  4. 2019.3.1版本Pycharm的使用
  5. 创建mysql视图语法正确的是_MySQL创建视图的语法格式
  6. [Ubuntu16.04]Anaconda下运行jupyter notebook出现Running as root is not recommended.
  7. inode及硬链接和软链接
  8. html5移动端单视频播放代码,js移动端视频播放代码
  9. 机械专业向机器人工程专业转型的可行性与前景分析
  10. uni-app开发经验分享十五: uni-app 蓝牙打印功能
  11. 《合作的进化》pdfmobiepub电子版
  12. Django之路由配置(url与path及re_path区别)
  13. 论劳动生产力进步的原因,兼论劳动产品在不同阶级人民之间自然分配顺序(读后感)
  14. QQ互赞助手pro【每天免费互shua名片赞】2.0系统版本
  15. Zabbix官方文档以及日常运维
  16. 现场工程师出手-PCAPHub与云SSH隧道稳妥实现异地LAN IIoT联测
  17. Win10 内置Intel AC-3165无法开启热点 解决
  18. JavaScript中pageX pageY offsetX offsetY区别
  19. html5 拓扑图 切片,HTML5复杂拓扑图(四) 组织结构图
  20. cvi读写.csv文件

热门文章

  1. 虚拟服务器的运行原理,虚拟机复制的工作原理
  2. hashmap value可以为空吗_美团面试题:Hashmap结构,1.7和1.8有哪些区别(最详细解析)...
  3. 武汉大学计算机学院放假时间,计算机学院关于2019年学生放暑假的通知
  4. 给定n本书的名称和定价,本题要求编写程序,查找并输出其中定价最高和最低的书的名称和定价
  5. dbscan算法中 参数的意义_基于变参数的DBSCAN算法
  6. C语言优势大揭露,你还在等什么呢?
  7. 使用Python和OpenCV进行文本偏斜校正
  8. Pcl:Normal的定义结构及输出
  9. PyCharm导入numpy包遇到的问题
  10. 办公计算机培训方案,计算机办公软件应用培训教学计划规划方案.docx