android进程间通讯.ppt_第1页
android进程间通讯.ppt_第2页
android进程间通讯.ppt_第3页
android进程间通讯.ppt_第4页
android进程间通讯.ppt_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、安卓进程间通信、目录、活页夹框架活页夹介绍了安卓进程间通信活动内容提供商广播辅助工具、活页夹框架(1)、活页夹框架(2)、活页夹应用层类继承关系、安卓系统通信模式活页夹,活页夹通信的实现:1。活页夹通信是通过linux活页夹驱动程序实现的。绑定通信操作类似于线程迁移,两个进程之间的IPC看起来像一个进程进入另一个进程执行代码,然后返回执行结果;3.Binder的用户空间为每个进程维护一个可用的线程池。线程池用于处理传入的IPC和执行进程本地消息。活页夹通信是同步的,而不是异步的。安卓系统中绑定器通信的要点:1 .安卓系统中的绑定通信基于服务和客户端的工作模式;2.所有需要IBinder通信的进

2、程都必须创建一个IBinder接口;3.系统中有一个管理所有系统服务的过程:4 .安卓系统不允许用户添加未经授权的系统服务;5.既然源代码已经打开,我们可以修改一些代码来达到添加底层系统服务的目的;6.对于用户程序,我们还需要为进程间通信创建一个服务器或服务;7.练习管理服务管理所有服务创建、连接、断开;在JAVA应用层;8.所有活动也通过此服务启动和加载;9.练习管理服务也在系统服务中加载;活页夹,安卓服务工作流1。在安卓虚拟机启动之前,系统将首先启动服务管理器进程;2.服务管理器打开绑定器驱动程序,并通知绑定器内核驱动程序该进程将充当系统服务管理器;3.然后进程将进入一个循环,等待处理来自

3、其他进程的数据。4.创建系统服务后,用户通过默认服务管理器获得远程服务管理器的界面。通过这个接口,我们可以调用addService函数将系统服务添加到服务管理器进程中。5.然后,客户端可以获得需要通过getService连接的目标服务的IBinder对象。这个绑定器是绑定器内核中服务绑定器的引用。6.因此,服务IBinder在绑定器内核中没有相同的两个IBinder对象,每个客户端进程也需要打开绑定器驱动程序。对于用户程序,当我们得到这个对象时,我们可以通过binder内核访问服务对象中的方法。7.客户和服务处于不同的过程中。这样,实现了类似于线程间迁移的通信模式。对于用户程序,当调用服务返回

4、的接口时,访问服务中的方法就像调用自己的函数一样。binder,进程有自己的地址空间,不同进程之间的通信不能直接引用该地址。一般的解决方案是,发送过程根据某种格式(marshall)将待传输的数据转换成二进制形式/特定格式的数据,并将其发送给接收过程;在接收到二进制形式和特定格式的数据后,接收过程将其分解为原始数据,然后使用它。这是活页夹使用的步骤。绑定器采用同步c/s模式,S循环阻塞接收数据的操作,随时处理C的数据,处理后发回C;c向S发送请求的服务数据,阻塞S返回的数据,并在收到数据后继续自己的工作。活页夹的框架可分为三层。最底层是linux操作系统和绑定驱动程序。绑定驱动程序本质上是进程

5、间的共享内存,每个进程将发送给其他进程的数据写入驱动程序,并从驱动程序中读取其他进程发送的数据。中间层是由cpp实现的框架,完成数据的接收和发送转换,支持c/s进程。事实上,在中间层,binder的架构已经完全具备了。但是android使用java作为通用应用的开发语言。因此,它需要jni和相应的java binder类的支持,后者是中间层之上的第三层:JNI/Java,binder驱动和binder驱动是binder机制的基础,是实现ipc的通道。binder驱动程序与框架和应用程序之间的功能操作由ioctl实现。最基本的操作是数据读写。读写操作由两个子操作组成:写子操作和读子操作。驱动程序

6、为每个进程和线程维护一个数据结构,其中有一个列表和一个信号量,其他进程写入的数据被挂接到该列表中。写子操作负责将数据链接到接收进程的相应数据结构的列表。读取器操作负责在自己的进程中处理列表上的数据,并返回框架和应用程序。绑定驱动程序的第二个功能是支持rpc,即维护本地函数和远程代理句柄之间的对应关系。维护两个远程代理的句柄之间的对应关系更加复杂,这两个代理是同一个rpc的代理。binder框架,binder框架由cpp实现,分为本地/s和远程/c来描述。公共类IBinder派生自两个子类:本地的Binder和远程的BpBinder。本地实现的类是作为基类从Binder派生的。在接收到数据后,它

7、处理该结构并将其发送到远端。远程代理类使用BpBinder在本地接收和发送数据。为了进一步促进开发,引入了IIInterface类,开发人员从接口派生子类来定义他们自己的rpc操作。在Interface的修饰下,局部键类为接口;是从Binder派生的;包含成员BpBinder对象的远程键类BpInterface是从BpRefBase派生的。因此,在创世纪中,上帝说:只要有光,就会有光。上帝认为光是好的,所以他把光和暗分开。上帝称光明为白天,称黑暗为夜晚。有晚上也有早上,这是第一天。binder jni,java类和aidl工具,binder框架的机制需要打包才能被java使用。除了jni相关部

8、分,android还用java、IBinder、Binder、BinderProxy、Interface、BinderInternal定义了几个相关的接口和类。Aidl工具是java实现c/s结构的方便工具。当开发人员编写简单的接口描述idl文件时,aidl自动生成本地和远程的Binder类。让开发人员关注实际的功能开发,而不要为绑定机制浪费不必要的精力。包裹,为了便于ipc之间传输数据的操作,binder引入了包裹的概念。包裹可以被认为是快递公司的包装盒。要传输的各种数据都打包成包裹类。binder负责传输包裹对象,而接收器则负责从包裹中解析数据。这种机制不仅降低了各种数据类型传输的复杂性,

9、而且可以通过增加打包/拆包的数据类型来轻松扩展。宗地已经支持容纳基本数据类型和一些复合数据类型。在框架级别上,宗地提供了一个可展平的基类,它可以扩展宗地拥有的数据类型。在java宗地级别,宗地提供了一个可分割的接口,可以扩展宗地可以容纳的数据类型。依赖于binder服务,ipc/rpc已经被binder机制解决了,那么该服务面临的唯一问题就是如何使想要使用该服务的客户招募该服务。服务经理是解决方案。服务管理器是一个特殊的过程,每个服务都将在服务管理器中注册,客户端可以从服务管理器中查询它需要使用的服务。安卓跨进程通信,在安卓SDK中提供了四种跨进程通信方式。这四种模式恰好对应于安卓系统中的四个

10、应用组件:活动、内容提供商和广播服务。其中,活动可以跨流程调用其他应用程序的活动;内容提供者可以跨进程访问其他应用程序中的数据(以游标对象的形式返回)。当然,它也可以在其他应用程序中添加、删除和修改数据;广播可以向安卓系统中的所有应用程序发送广播,需要跨进程通信的应用程序可以监控这些广播;服务类似于内容提供者,并且可以在其他应用程序中访问数据,但是不同之处在于内容提供者返回游标对象,而服务返回Java对象。这种可以跨进程通信的服务称为AIDL服务,它可以访问其他应用程序的活动。活动可以在流程内(同一个应用程序)或跨流程访问。活动的跨流程访问与流程内访问略有不同。虽然它们都需要意图对象,但是跨进

11、程访问不需要指定活动的上下文对象和类对象,而是指定与要访问的活动相对应的操作(一个字符串)。一些活动还需要指定一个Uri(由意图构造函数的第二个参数指定)。如果您想在同一个应用程序中访问活动,您需要指定活动的上下文对象和类对象。意图=新的意图(这,测试类);startActivity(意向);活动的跨流程访问与流程内访问略有不同。虽然它们都需要意图对象,但是跨进程访问不需要指定活动的上下文对象和类对象,而是指定与要访问的活动相对应的操作(一个字符串)。一些活动还需要指定一个Uri(由意图构造函数的第二个参数指定)。活动分享,1。在AndroidManifest.xml文件中指定操作。指定操作要

12、使用的标记,并在标记的android:name属性中指定操作2。在AndroidManifest.xml文件中指定访问协议。当指定URI(意图类的第二个参数)时,需要访问协议。访问协议需要由标记的android:scheme属性指定。如果这个属性的值是“abc”,那么Uri应该是“abc:/Uri的主体部分”,也就是说,访问协议是Uri的开始部分。3.通过getIntent()方法获取协议后的Uri的主体部分。getData()。getHost()。这个主机只是一个标题,不一定是主机名。读者可以将其视为任意字符串。4.从捆绑对象中获取其他应用程序传递的数据。5.当然,这一步是在获得数据后做进一

13、步的处理。至于如何处理这些数据,必须根据具体需要来决定。内容提供商,安卓应用程序可以使用文件或卫星数据库来存储数据。内容提供商提供了一种在多个应用程序之间共享数据的方法(跨流程共享数据)。应用程序可以使用内容提供程序来完成以下任务:1 .查询数据;2.修改数据;3.添加数据;4.删除数据。虽然内容提供者也可以在同一个应用程序中访问,但是这样做是没有意义的。内容提供商的存在是为了与其他应用程序共享数据,并允许其他应用程序添加、删除和修改数据。安卓系统本身提供许多内容提供商,如音频、视频、联系信息等。我们可以通过这些内容提供商获得相关信息的列表。列表数据将作为光标对象返回。因此,从内容提供者返回的

14、数据是二维表格的形式。对于访问内容提供程序的程序,您需要使用内容解析器对象。需要通过使用getContentResolver方法来获取该对象。代码如下:内容解析器Cr=GetContentResolver();与活动一样,内容提供商也需要与URI保持一致。每个内容提供商可以控制多个数据集。在这种情况下,每个数据集对应于一个单独的URI。所有URIs必须以“content:/”开头。为了使程序更容易维护和简化程序代码,URI一般被定义为常数,编写内容提供者的具体步骤如下:1 .写一个继承自安卓的子类。这个类是ContentProvider的核心类。查询、插入、更新和删除方法在此类中实现。实际上,调用ContentResolver类的这四个方法意味着调用ContentProvider类的相应方法。本文只介绍查询。插入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论