android进程间通讯

上传人:一*** 文档编号:243157917 上传时间:2024-09-17 格式:PPT 页数:23 大小:487KB
返回 下载 相关 举报
android进程间通讯_第1页
第1页 / 共23页
android进程间通讯_第2页
第2页 / 共23页
android进程间通讯_第3页
第3页 / 共23页
点击查看更多>>
资源描述
書式編集。,書式編集。,2,目,3,目,4,目,5,目,6,目,7,目,8,目,9,目,*,書式編集。,*,書式編集。,書式編集。,2,目,3,目,4,目,5,目,6,目,7,目,8,目,9,目,*,書式編集。,書式編集。,2,目,3,目,4,目,5,目,6,目,7,目,8,目,9,目,Android,进程间通讯,目录,B,inder,框架,B,inder,介绍,Android跨进程通讯,Activity,Content Provider,Broadcast,AIDL,Binder,框架(一),Binder,框架(二),Binder,应用层类继承关系,Android,系统通信方式,Binder,Binder,通信的实现 :,1.Binder,通信是通过,linux,的,binder driver,来实现的,,2.Binder,通信操作类似线程迁移,(thread migration),,两个进程间,IPC,看起来就象是一个进程进入另一个进程执行代码然后带着执行的结果返回;,3.Binder,的用户空间为每一个进程维护着一个可用的线程池,线程池用于处理到来的,IPC,以及执行进程本地消息,,Binder,通信是同步而不是异步。,Binder,Android,中的,Binder,通信实现要点:,1. Android,中的,Binder,通信是基于,Service,与,Client,的工作模型的;,2.,所有需要,IBinder,通信的进程都必须创建一个,IBinder,接口;,3.,系统中有一个进程管理所有的,system service,:,4. Android,不允许用户添加非授权的,System service,;,5.,现在源码开放了,我们可以修改一些代码来实现添加底层,system Service,的目的;,6.,对用户程序来说,我们也要创建,server,或者,Service,用于进程间通信;,7.,ActivityManagerService,管理,JAVA,应用层所有的,service,创建与连接,(,connect),disconnect,;,8.,所有的,Activity,也是通过这个,service,来启动,加载的;,9.,ActivityManagerService,也是加载在,Systems,Servcie,中的;,Binder,Android,的,Service,工作流程,1.Android,虚拟机启动之前系统会先启动,service Manager,进程;,2.service Manager,打开,binder,驱动,并通知,binder kernel,驱动程序这个进程将作为,System Service Manager,;,3.,然后该进程将进入一个循环,等待处理来自其他进程的数据。,4.,用户创建一个,System service,后,通过,defaultServiceManager,得到一个远程,ServiceManager,的接口,通过这个接口我们可以调用,addService,函数将,System service,添加到,Service Manager,进程中;,5.,然后,client,可以通过,getService,获取到需要连接的目的,Service,的,IBinder,对象,这个,IBinder,是,Service,的,BBinder,在,binder kernel,的一个参考,,6.,所以,service,IBinder,在,binder kernel,中不会存在相同的两个,IBinder,对象,每一个,Client,进程同样需要打开,Binder,驱动程序。对用户程序而言,我们获得这个对象就可以通过,binder kernel,访问,service,对象中的方法。,7.Client,与,Service,在不同的进程中,通过这种方式实现了类似线程间的迁移的通信方式,对用户程序而言当调用,Service,返回的,IBinder,接口后,访问,Service,中的方法就如同调用自己的函数。,binder,进程有自己的地址空间,不同进程间的通信并不能直接引用地址。一般的解决途径是,发送进程把需要传送的数据按照一定格式,(,marshall,),转换成二进制形式,/,特定格式的数据,发往接收进程;接收进程收到二进制形式、特定格式的数据后,反转换,(,unmarshall,),成原文数据,然后使用。,binder,使用的就是这种步骤。,binder,使用的是同步,c/s,模型,,s,循环阻塞在接收数据操作上,随时处理,c,的数据,处理后发送回,c,;,c,则将请求服务的数据发送到,s,,阻塞在收取,s,返回数据,收到数据后,继续自己的工作。,binder,的框架可以分成,3,层 最下层是,linux,os,和,binder driver,。,binder driver,本质上是进程间的共享内存,各进程将要发送到其它进程的数据写入到,driver,,从,driver,读取其它进程发送来的数据。 中间层是,cpp,实现的,framework,,完成数据的接收发送转换,和,c/s,流程的支持。 其实到中间层,,binder,的架构就已经完全具备了。但,android,使用的是,java,做为一般,app,的开发语言。所以还需要,jni,和相应,java binder,类的支持,这就是中间层上面的第三层:,jni,/java,binder driver,binder driver,是,binder,机制的基础,是实现,ipc,的通道。,binder driver,与,framework,和,app,的功能操作是用,ioctl,方式实现的。最基本的操作是数据读写操作。一次读写操作有两个子操作组成:写子操作和读子操作。,driver,为每个进程和线程维护了一个数据结构,其中有一个,list,,挂接了其它进程写入的数据,还有一个信号量。写子操作负责将数据挂接到接收进程对应数据结构的,list,上。读子操作负责处理自己进程中,list,上的数据,传回,framework,和,app,。,binder driver,的第二个功能是为了支持,rpc,,就是维护本地函数和远端,proxy,的,handle,之间的对应关系。更复杂的是维护两个远端,Proxy,的,handle,之间的对应关系,这两个,proxy,是同一,rpc,的,proxy,。,binder framework,binder,的,framework,是,cpp,实现的,这里分成本地,local/s,和远端,remote/c,两半来描述。公共类,IBinder,派生出两个子类,,BBinder,用于,local,,,BpBinder,用于,remote,。本地实现的类以,BBinder,为基类派生,接收数据后,处理,并将结构发会远端。远端,proxy,的类使用,BpBinder,,接收和发送数据到本地。进一步方便开发,引入了,IInterface,类,开发者从,Interface,派生子类,定义自己需要的,rpc,操作。在,IInterface,的装饰下,从,BBinder,派生出了本地的关键类,BnInterface,;从,BpRefBase,派生出了包含成员,BpBinder,对象的远端关键类,BpInterface,。于是,创世纪中,神说:要有光,就有了光。神看光是好的,就把光暗分开了。 神称光为昼,称暗为夜。有晚上,有早晨,这是头一日。,binder,jni,java,类和,aidl,工具,binder framework,的机制要被,java,使用,需要经过包装。除了,jni,相关部分,,android,在,java,中还定义了几个相关的接口和类,,IBinder,,,Binder,,,BinderProxy,,,IInterface,,,BinderInternal,。,aidl,工具则是方便,java,实现,c/s,结构的一个工具,开发者编写简单的接口描述,idl,文件,则,aidl,自动生成,local,和,remote,的,Binder,类。让开发者关注在实际的功能开发上,不必为,binder,机制耗费无谓的精力,parcel,为了便于,ipc,之间传递的数据的操作,,binder,引入了,parcel,的概念。,parcel,可以想成快递公司的包装箱,需要传递的各种类型的数据都被打包进,parcel,类,,binder,负责传递,parcel,对象,接收端则从,parcel,解出数据。这样的机制即减少了各种数据类型对传递的复杂性,又可以通过增加打包,/,解包,parcel,的数据类型,轻易实现扩展。,parcel,已经支持容纳基本数据类型和一些复合数据类型。在,framework,层面,,parcel,提供了,Flattenable,基类,可以扩展,parcel,容纳的数据类型。在,java parcel,层面,,parcel,提供了,Parcelable,接口,可以扩展,parcel,容纳的数据类型。,依赖于,binder,的,service,ipc/rpc,已经被,binder,机制解决掉了,那么,service,面临的唯一问题就是,service,如何让想使用,service,的,client,招到,service,。解决的方案就是,service manager,。,service manager,是一个特殊进程,每个,service,都会注册登记到,service manager,中,而,client,可以从,service manager,查询得到自己需要使用的,service,。,Android跨进程通讯,在,android,SDK,中提供了,4,种用于跨进程通讯的方式。这,4,种方式正好对应于,android,系统中,4,种应用程序组件:,Activity,、,Content Provider,、,Broadcast,Service,。,其中,Activity,可以跨进程调用其他应用程序的,Activity,;,Content,Provider,可以跨进程访问其他应用程序中的数据(以,Cursor,对象形式返回),当然,也可以对其他应用程序的数据进行增、删、改操,作;,Broadcast,可以向,android,系统中所有应用程序发送广播,而需要跨进程通讯的应用程序可以监听这些广播;,Service,和,Content,Provider,类似,也可以访问其他应用程序中的数据,但不同的是,,Content,Provider,返回的是,Cursor,对象,而,Service,返回的是,Java,对象,这种可以跨进程通讯的服务叫,AIDL,服务,访问其他应用程序的,Activity,Activity,既可以在进程内(同一个应用程序)访问,也可以跨进程访问。Activity的跨进程访问与进程内访问略有不同。虽然它们都需要Intent对象,但跨进程访问并不需要指定Context对象和Activity的,Class对象,而需要指定的是要访问的Activity所对应的Action(一个字符串)。有些Activity还需要指定一个Uri(通过,Intent构造方法的第2个参数指定)。,如果想在同一个应用程序中访问,Activity,,需要指定,Context,对象和,Activity,的,Class,对象,。,Intent,intent,= new,Intent(this,Test.class,);,startActivity(intent,); Activity,的跨进程访问与进程内访问略有不同。虽然它们都需要,Intent,对象,但跨进程访问并不需要指定,Context,对象和,Activity,的,Class,对象,而需要指定的是要访问的,Activity,所对应的,Action,(一个字符串)。有些,Activity,还需要指定一个,Uri,(通过,Intent,构造方法的第,2,个参数指定)。,Activity,共享,1.,在,AndroidManifest.xml,文件中指定,Action,。指定,Action,要使用,标签,并在该标签的,android:name,属性中指定,Action 2.,在,AndroidManifest.xml,文件中指定访问协议。在指定,Uri,(,Intent,类的第,2,个参数)时需要访问协议。访问协议需要使 用,标签的,android:scheme,属性来指定。如果该属性的值是“,abc,”,,那么,Uri,就应该是“,abc,:/Uri,的主体 部分”,也就是说,访问协议是,Uri,的开头部分。,3.,通过,getIntent().getData().getHost,(),方法获得协议后的,Uri,的主体部分。这个,Host,只是个称谓,并不一定是主机名。读者可以将其看成是任意的字符串。,4.,从,Bundle,对象中获得其他应用程序传递过来的数据。,5.,这一步当然是获得数据后做进一步的处理了。至于如何处理这些数据,就得根据具体的需求决定了。,Content Provider,Android应用程序可以使用文件或SqlLite数据库来存储数据。Content,Provider提供了一种在多个应用程序之间数据共享的方式(跨进程共享数据)。应用程序可以利用Content,Provider完成下面的工作,1.,查询数据,2.,修改数据,3.,添加数据,4.,删除数据,虽然Content,Provider也可以在同一个应用程序中被访问,但这么做并没有什么意义。Content,Provider存在的目的向其他应用程序共享数据和允许其他应用程序对数据进行增、删、改操作,。,Android系统本身提供了很多Content,Provider,例如,音频、视频、联系人信息等等。我们可以通过这些Content,Provider获得相关信息的列表。这些列表数据将以Cursor对象返回。因此,从Content,Provider返回的数据是二维表的形式,。,对于访问,Content Provider,的程序,需要使用,ContentResolver,对象。该对象需要使用,getContentResolver,方法获得,代码如下:,ContentResolver,cr,=,getContentResolver,();,与,Activity,一样,,Content Provider,也需要与一个,URI,对应。每一个,Content Provider,可以控制多个数据集,在这种情况下,每一个数据集会对应一个单独的,URI,。所有的,URI,必须以“,content:/”,开头。 为了程序更容易维护,也为了简化程序代码,一般将,URI,定义成一个常量,编写,Content Provider,的具体步骤,1.,编写一个继承于,android.content.ContentProvider,的子类。该类是,ContentProvider,的核心类。在该类中会实现,query,、,insert,、,update,及,delete,方法。实际上调用,ContentResolver,类的这,4,个方法就是调用,ContentProvider,类中与之要对应的方法。在本文中只介绍,query,。至于,insert,、,update,、,delete,和,query,的用法类 似。也是通过,Uri,传递参数,然后在这些方法中接收这些参数,并做进一步地处理。,2.,在,AndroidManifest.xml,文件中配置,ContentProvider,。要想唯一确定一个,ContentProvider,,需要指定这个,ContentProvider,的,URI,,除此之外,还需要指定,URI,所对应的,ContentProvider,类。这有些象,Servlet,的定义,除了要 指定,Servlet,对应的,Web,地址,还要指定这个地址所对应的,Servlet,类。,广播(,Broadcast,),广播是一种被动跨进程通讯的方式。当某个程序向系统发送广播时,其他的应用程序只能被动地接收广播数据。这就象电台进行广播一样,听众只能被动地收听,而不能主动与电台进行沟通。 在应用程序中发送广播比较简单。只需要调用,sendBroadcast,方法即可。该方法需要一个,Intent,对象。通过,Intent,对象可以发送需要广播的数据。 先建一个,android,工程:,sendbroadcast,。在,XML,布局文件中放两个组件:,EditText,和,Button,,当单击按钮后,会弹出显示,EditText,组件中文本的对话框,关闭对话框后, 会使用,sendBroadcast,方法发送消息,并将,EditText,组件的文本通过,Intent,对象发送出去。,AIDL,服务,服务(,Service,)是,android,系统中非常重要的组件。,Service,可以脱离应用程序运行。也就是说,应用程序只起到一个启动,Service,的作用。一但,Service,被启动,就算应用程序关闭,,Service,仍然会在后台运行。,android,系统中的,Service,主要有两个作用:后台运行和跨进程通讯。后台运行就不用说了,当,Service,启动后,就可以在,Service,对象中 运行相应的业务代码,而这一切用户并不会察觉。而跨进程通讯是这一节的主题。如果想让应用程序可以跨进程通讯,就要使用我们这节讲的,AIDL,服 务,,AIDL,的全称是,Android Interface Definition Language,,也就是说,,AIDL,实际上是一种接口定义语言。通过这种语言定义接口后,,Eclipse,插件(,ODT,)会自动生成相应的,Java,代码接 口代码。,编写,AIDL,步骤,1.,在,Eclipse,工程的,package,目录中建立一个扩展名为,aidl,的文件。,package,目录就是,Java,类所在的目录。该文件的语法类似于,Java,代码。,aidl,文件中定义的是,AIDL,服务的接口。这个接口需要在调用,AIDL,服务的程序中访问。,2.,如果,aidl,文件的内容是正确的,,Eclipse,插件会自动生成一个,Java,接口文件(*,.java,)。,3.,建立一个服务类(,Service,的子类)。,4.,实现由,aidl,文件生成的,Java,接口。,5.,在,AndroidManifest.xml,文件中配置,AIDL,服务,尤其要注意的是,,标签的,android:name,属性值就是客户端要引用该服务的,ID,,也就是,Intent,类构造方法的参数值。,
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 小学资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!