- 浏览: 1589827 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (289)
- java 语法基础 (51)
- spring (8)
- mvc struct /Ant --build.xml (8)
- SOA (0)
- oracle 9i/10g (23)
- sql server 2000-2005 (3)
- 数据库基础知识 (6)
- 设计模式与软件架构 (10)
- Hibernate 持久化 (9)
- J2SE/J2EE/J2ME/AJAX 技术 (8)
- JSF 技术 (3)
- JAVA 图形化 (0)
- JMS (40)
- Eclipse 3.2 IDE 开发技巧 (13)
- 项目处理方法集合 (2)
- html/jsp/javascript (2)
- Unix/Linux (9)
- j2me/ARM/windriver/嵌入式 (4)
- 电信科学 (8)
- jsp (1)
- c/c++ (1)
- LZW压缩算法(java) (2)
- Android (77)
- 版本管理git/svn (2)
最新评论
-
huihai:
有demo吗?
NamingStrategy实现动态表名映射 -
cangbaotu:
推荐给大家一些有用的爬虫源码:https://github.c ...
网络爬虫(源代码参考) -
tuspark:
除了.classpath文件以外,.project文件也应该了 ...
Eclipse .classpath文件浅谈 -
tuspark:
造成eclipse自动关闭的原因有很多,这里有很多介绍:ecl ...
eclipse 自动关闭 解决方案 -
DEMONU:
网上都是这些,这种文章。。。
ActiveMQ中的消息持久性
在Android中窗体与窗体之间如何互相调用和交换数据?窗体(Activity)和后台的服务(Service)如何通信?基于 Unix(Linux
)
的系统都有一个很优秀的传统,就是倡导非常轻便的进程间通信(IPC)机制;倡导进程通过IPC来互相协作;倡导功能单一,小巧而强壮的进程,而不是又大
又复杂的“万金油”。同样,在Android中我们可以将我们的Activity和Service放在不同的进程中运行,我们可以在我们的Task
中加载其他进程的Activity,这些机制都鼓励我们“尽量利用已有的功能,利用IPC和包含这些已有功能的程序协作,来完成一个完整的应用”,例如在
我们的程序中充分利用Google Map的相关窗体和服务。所有这些都建立在一套轻便好用的IPC机制上。
Android的组件和进程间通信都建立在一种基于称为Intent的消息基础之上。Intent就是一种消息,它包含了两个重要的内容:1.
消息的目的,即这个消息是发给哪个组件的?(消息的目的中不会包含“消息是发给哪个进程”这样的信息,这里Android有意淡化进程的概念,而只让我们
关心组件,因为了解太多关于进程的具体信息会加大复杂度,而又如何做到进程间的消息传递呢?下文会说到一种Android中关于这点比较特别的设计方式,
我认为是一种简捷有用又符合手机特点的设计);2.
消息所携带的数据内容,即需要传递给目标的数据。下面是一个简单的利用Intent来启动一个Service并向其传递数据的代码示例:
Intent serviceIntent = new Intent(context, svrMain.class);
serviceIntent.putExtra(“Network_Report”, networkStatus);
context.startService(serviceIntent);
上面的代码首先构造了一个Intent对象,并在构造的时候指定了这个Intent的目的地,即“svrMain.class”,表示这个Intent是
要传递给一个类名叫svrMain的Service。然后向这个Intent中放入了一个数据,数据的key为
“Network_Report”,value为一个叫networkStatus的int类型变量,用来指明当前网络的状态。最后我们使用系统提供的上
下文API,将这个Intent传递给指定的Service。
Intent的消息目的地分为两种模式,一种是显式的,一种是隐式的。我们上面的例子中看到的就是一个显式消息的例子。显式消息直接指定消息目的地组件的
类元信息,例如上面例子中svrMain就是我们写的一个类名为svrMain的Service,class操作符就是获取其类元信息。这种模式的消息由
于已经确切知道了消息目标的确切信息,所以只适用于同一进程内的不同组件之间通信,例如打开一个子窗体,和同一进程中的service通信等。对应的,隐
式消息就一般用于跨进程的通信了,隐式消息没有确定的消息目的地,除了数据外,隐式消息只是包含了一些用于表征消息特征的描述字段。而一些需要收到某种特
定特征消息的某个程序中的某个组件,需要通过在其所在程序的AndroidMainifest.xml中注册一种被称为intent-filter的消息
特征筛选器,然后Android系统会按照一定的匹配规则来匹配发出的消息特征和所有拥有响应这种特征的intent-filter的组件(无论是同一进
程内的组件还是不同程序中的组件),匹配到的组件就会接受到相应的消息。前面的描述多少有些拗口,我们举个实际的例子来说明,如果我们想开启一个子窗体
(无论这个窗体来自同一进程还是不同进程),我们除了使用显式消息外,我们还可以使用隐式消息:
Intent openSomeDiagIntent = new Intent();
openSomeDiagIntent.setAction(“edwin.demo.fooActivity”);
this.startActivity(openSomeDiagIntent);
上面的隐式消息不包含具体的目的地,而是仅包含一个名位“Action”的特征字符串,Action就是上文所说的Intent特征的一种。从字面上来理
解,可以理解为这个消息所代表的是完成某一个动作的含义,由action来标明动作的名字。所有能够处理这种动作的Activity都可以收到该消息。对
应的,可能在同一个程序或者另外的某个程序的AndroidMainifest.xml中声明了下面这样的一个Activity:
<activity android:name=”.fooActivity”>
<intent-filter>
<action android:name=”edwin.demo.fooActivity” />
</intent-filter>
</activity>
那么这就表示这个Activity能够收到并处理action为“edwin.demo.fooActivity”的消息。所以上面的代码串起来的效果就是,打开了这个名为.fooActivity的窗口,无论这个窗口是在当前的进程中还是另外的一个程序中。
除了Action这种消息特征外,Intent还有category,data这两个特征描述属性。Category同样是一个字符串,从字面上理解就是
“消息的分类特征”。从程序上看其和Action的不同在于,一个Intent只能有惟一的一个Action名称,但是却可以包含多个Category字
符串;一个Intent-Filter可以包含多个Action节点但至少要包含一个,另一方面一个Intent-Filter可以包含零到多个
Category节点。Android在做Intent-Filter匹配的时候,Intent的Action属性匹配到Intent-Filter中的
任何一个action节点,就表明拥有这个Intent-Filter的组件能够处理这种消息;而对于Category来讲一个Intent中的所有的
Category都必须存在于Intent-Filter中的Category节点中时,才表明匹配成功。Data属性可以描述一个Intent所要传递
的数据类型和URI,每一个Intent只能包含一个Data属性。其中数据的类型使用MIME类型描述方式来描述,例如video/mpeg表示编码格
式为mpeg的视频,这里也可以使用通配符,例如video/*表示任意格式的视频文件类型;数据的URI由scheme(协
议),host,port,path四部分组成:scheme://host:port/path,例如http://test.com:8080
/file/file1
或者content://edwin.demo.contentProvider:100/forder/content1,其中path部分也是可以支
持通配符的。Data属性是一个很有用的描述特征,例如下面这样的一个包含data节点的Intent-Filter:
<activity android:name=”.actHttpVideoMan”>
<intent-filter>
<action android:name=”edwin.demo.actHttpVideoMan.Main” />
<data android:scheme=”http” android:type=”video/*” />
</intent-filter>
</activity>
它表示窗体actHttpVideoMan能够处理来自web服务器的视频文件。这样的filter有什么作用呢?最典型的情况就是配合浏览器工作。浏览
器在打开一个链接的时候首先会尝试显示这个链接对应的html页面,如果这个链接不是一个html页面,而是一个视频文件或者其他浏览器本身不能处理的格
式的话,浏览器会使用隐式消息尝试开启一个能够处理这种数据格式的Activity来处理,浏览器发出的隐式消息就是一个包含data属性,其中URI
scheme为http,数据类型为video/*的消息,如果有能够匹配这个intent的组件,例如我们上面的那个activity,浏览器就会启动
这个窗体,接着这个窗体会根据data属性指定的URI去播放在线视频,如果没有可以处理这个intent的Activity,浏览器才会调用下载管理器
下载文件。
隐式消息这个设计简单有效,它忽略了进程的细节,让IPC在一个更高的更接近人脑思维模式的层次工作,让系统中的不同进程协作看起来就像是同一程序中的协
作一样,这种简单的IPC机制在很大的程度上鼓励我们和其他进程协作,通过协作的进程来完成一个复杂的任务,而不是把什么功能都做到一个大而全的程序里
面。不过上文还有一些细节没有提到,例如如果一个intent有多个可匹配的处理组件,系统如何处理?这就要分响应消息的组件类型来说了,如果是
service,那么这些service都可以启动并处理消息,如果是Activity,则android会弹出一个对话框让用户进行选择。比如我们安装
了多个可以处理在线视频的软件,当我们在浏览器中点击一个在线视频的链接时,系统会让用户选择使用哪个软件来观看。另外大家一定会想到安全性的问题,如果
不同进程间的组件可以通过隐式消息互相通信,那我们的程序不是可以轻易调用到其他的程序或者系统中的一些敏感程序的组件,这样会不会很不安全呢?其实
Android在安全方面有一个统一,完备和轻便的安全策略模型,Intent的安全自然是被考虑在内的,关于android的安全模型我会在后续的系列
blog中专门说明。
最后,除了Intent这种基于消息的进程内和进程间通信模型外,android中也有一种相比起来稍显笨重一些的IPC机制,它采用类似远程方法调用的
方案,通过接口定义文件AIDL来定义一个IPC接口,然后通过接收方实现接口,调用方调用接口的本地代理实现来完成IPC。这种模型只适用于
Activity和Service间的通信,之所以需要这种稍显重量的模式,是因为Activity除了发送intent去启动一个service外,可
能还需要能够在Service的运行过程中连接到service,对Service发送一些控制请求。例如音乐播放程序,其后台的播放服务往往独立运行,
以方便我们在使用其他程序界面时也能听到音乐。同时这个后台播放服务也会定义一个控制接口,包含比如播放,暂停,快进之类的方法,任何时候播放程序的界面
都可以通过使用bindService
API连接到播放服务,获取这个接口的包含IPC细节的实现代理,通过这组控制接口方法对其进行控制,这时这种IPC的方案就显的更方便更直观一些了。有
关使用AIDL这种IPC的更详细描述, google的官方文档="">已做了详细的讲解。
发表评论
-
APN(default、mms、supl、dun、hipri接入点类型的区别)
2013-10-10 19:31 45819设置APN上网时,大家可能经常遇到这个问题:为什么有时要填写 ... -
AMR音频编码器概述及文件格式分析
2013-10-10 19:29 3951全称Adaptive Multi-Rate,自适应多速率编码 ... -
pad 强制加载 Hdpi资源 (2.3 dpi < 240)
2012-07-16 16:47 0pad 强制加载 Hdpi资源 (2.3 dpi < ... -
android 设计模式-享元模式
2011-12-16 23:01 2191享元(FlyWeight)模式,原意是“轻量级”模式,它用来解 ... -
statusbar 2.3
2011-11-08 16:04 1280以前我的文章分析过Stat ... -
android 输入法默认设置
2011-07-07 14:00 7191设置默认输入法 在 frameworks\base\co ... -
Android Media Scanner Process
2011-06-06 22:58 3402下面是系统图 Medi ... -
handler与多线程消息处理
2011-06-04 13:42 8278在Android下面也有多线程的概念,在C/C++中,子线程可 ... -
android light
2011-03-24 16:15 3411背光设置是在:设置->声音和显示->亮度,通过进度 ... -
PowerManagerService sensor
2011-03-22 20:06 2668默认分类 2010-12-24 14:34:55 阅读144 ... -
android 单例
2011-02-15 09:26 42241. Framework层的代码: A ... -
Android 开发之 Services 服务
2010-11-02 18:21 4238Service Service ... -
深入学习android之AlarmManager
2010-11-01 16:50 34754对应AlarmManage有一个Alarm ... -
eclipse+android+ddms+adt
2010-09-14 10:30 8452用eclipse + ADT作为android ... -
Menus
2010-09-05 19:01 1786Android Menus 文章分类:移动开发 1.O ... -
Android开机自启动应用开发
2010-08-28 10:07 4589目前需要开发一个开机自启动的GTD应用程序来提醒用户的 ... -
Android2.1_Launcher学习笔记
2010-08-11 13:40 3869文章分类:移动开发 好么,2.0的源码没看几天,2.1的 ... -
Browsing Android Source in Eclipse
2010-08-09 16:00 3433Google’s Android SDK includes ... -
android 编译
2010-08-07 16:31 25221 我的系统是Ubuntu 8.04 * 2 系统上 ... -
Ubuntu linux 右键添加"以管理员身份打开","在终端中打开"
2010-08-02 15:04 4644Ubuntu linux 右键添加"以管理员身份打开 ...
相关推荐
**Android进程间通信(IPC):AIDL详解** 在Android系统中,进程间通信(IPC,Inter-Process Communication)是应用程序之间数据交换的关键技术。AIDL(Android Interface Definition Language)是Android提供的一...
在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键机制,它允许不同应用或同一应用的不同进程之间交换数据。在Android的IPC方式中,AIDL(Android Interface Definition Language)是...
在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键机制,使得不同应用程序或同一程序的不同进程之间能够共享数据、调用服务等。本示例"android 进程间通信demo"专注于讲解如何利用...
在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键的技术,它使得不同应用之间能够共享数据和实现功能交互。在这个"Android进程间通信源码"项目中,我们有两个主要的组件:...
在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序之间数据交换的关键技术。AIDL(Android Interface Definition Language)是Android提供的一种强大的工具,它使得跨进程调用...
在"android_ipc_0430"这个压缩包文件中,可能包含了相关的代码示例、讲解文档或者项目源码,可以帮助读者更深入地理解和实践Android IPC通信。通过学习这些实例,开发者能够熟练掌握各种IPC机制,并能根据实际需求...
### Android进程间通信(IPC)机制Binder守护进程之路 #### 一、概述 在上一篇文章中,我们简要介绍了Android系统中的进程间通信(IPC)机制Binder及其整体架构。Binder机制由四大核心组件构成:客户端(Client)、...
在Android系统中,进程间通信(Inter-Process Communication, 简称IPC)是一种关键的技术,使得不同进程间的组件能够相互交互,实现数据共享和服务调用。AIDL(Android Interface Definition Language)是Android...
以上就是基于Socket的Android IPC通信的基本原理和实现步骤。通过这种方式,不同Android进程可以相互通信,实现复杂的功能,例如文件传输、实时消息推送等。但需要注意的是,Socket通信可能会消耗较多的系统资源,...
《Android IPC与Binder框架》是高焕堂先生深入解析Android系统中进程间通信(IPC)机制及其核心组件Binder的专业著作。这本书详细阐述了Android系统如何通过Binder实现不同进程间的高效、安全的数据交换,为开发者...
在Android系统中,多进程通信(Multi-Process Communication, 简称MPC)是一种重要的技术,用于在不同进程间交换数据和协调操作。在Android应用开发中,一个应用程序默认运行在一个单独的进程中,但有时我们需要创建...
2. **IPC Binder**:在RemoteService和RemoteServiceServer工程中,展示了如何创建和使用Binder进行进程间通信。服务(Service)在远程进程中提供 Binder 对象,客户端(Client)通过Binder接口调用服务的方法,实现...
在Android系统中,进程间通信(IPC,Inter-Process Communication)是实现不同应用程序组件协同工作的关键。Binder机制是Android独有的IPC方式,它不同于传统的Unix/Linux进程间通信机制,如管道、信号、共享内存等...
在Android系统中,IPC(Inter-Process Communication,进程间通信)是不同应用程序之间共享数据和协同工作的关键机制。本文将深入探讨Android IPC机制,并通过具体的ContentProvider和Socket通信实例进行详细解析。 ...
在Android系统中,进程间的通信(Inter-Process Communication, 简称IPC)是一项重要的技术,使得不同应用程序之间能够共享数据和服务。AIDL(Android Interface Definition Language)是Android提供的一种强大的...
Android提供了MemoryFile和ParcelFileDescriptor,它们允许在进程间共享内存区域或文件描述符,提高了通信效率。 10. **Android系统服务** Android系统服务如PowerManager、LocationManager等,其实现中大量使用...
IBinder是Android中实现进程间通信的关键接口,它定义了与远程对象进行交互的方法。在Android中,所有的IPC都是通过Binder机制来完成的,无论是客户端与服务端通信还是进程间的数据交换。 **2. IBinder的使用场景:...