AIDL是Android Interface Definition Language,意思就是 Android接口定义语言 。首先它是一种语言,它被设计出来的目的就是为了 实现进程间的通信 。
通过使用AIDL,可以帮我们生成进程间通信时需要用到的类和接口方法。
当然,我们也可以不借助AIDL,而是自己实现这些类和方法,但是借助AIDL会让这个过程变得简单方便。
上面提到的AIDL是一种语言,那么它肯定有属于自己的一套语法:
首先是文件类型,AIDL文件的后缀为.aidl。
其次是支持的数据类型,AIDL默认支持的一些数据类型,在使用这些数据类型时是不需要导包的(即不需要使用import ***),除了这些默认支持的数据类型外,使用其他类型则需要导包,即使目标文件与当前正在编写的 .aidl 文件在同一个包下。
AIDL默认支持的数据类型是:
AIDL文件主要分为两种类型,一种是定义parcelable对象的,例如:
上面将Book对象定义成了parcelable对象,这样才能成为AIDL文件支持的对象。
另一种是用来定义方法接口的,例如:
AIDL是一个缩写,全称是Android Interface Definition Language(Android接口定义语言)。主要用于进程间通信
创建AIDL文件跟创建interface类文件类似,只是文件后缀为.aidl,然后clean project,build project会自动生成带stub 实现binder的类文件。Android Studio可以通过右键要建aidl的包 ->New ->AIDL ->AIDL file 创建;生成的aidl文件会在 src/main/aidl/...pakcagename/*.aidl
编写与interface类似;与interface不同的是aidl文件仅是声明函数(不支持变量,常量或extends,函数也不支持重载)。
1)基本类型(int,long,boolean,float,double,char,CharSequence,String),不支持基础类型的封装类型(Integer...)
2)复杂类型(Map,List,Parcelable,aild)。其中Map不支持泛型,List支持。Map,List的类型需要是1的类型(Integer等可支持)或者是Parcelable,aidl
使用Parcelable,aidl类型的时,无论是否在引用类所在包,都需要显示声明
复杂类型做为参数时需要提明tag:in、out或inout。in代表参数是外流入函数,函数内对参数的 *** 作不会影响处部,out则是函数内修改会被同步至外部。inout则是双向(待进一步建立示例说明)
实现AIDL不是实现(implement)接口,而是继承接口.stub类(在编写完接口后build会产生)
说明:AIDL方法的实现是系统为aidl开的线程中执行,而非Service所属应用的主线程(如果调用与Service是同一个应用进程,则会在主线程执行?待验证)。
一般aidl在Service的public IBinder onBind(Intent intent) 中返回:
flags:Context.BIND_AUTO_CREATE
只有activities,services,和contentproviders可以绑定到一个service—你不能从一个broadcastreceiver绑定到service.
接口调用是同步的,即aFunction的执行会hold住调用者的线程,因此一般线程中调用。
Android进程间通信之AIDL(三)—— deadObject异常处理
AIDL文件中使用实现接口Parcelable的类
Android ServiceConnection
——————————————————————————————————————————
如果该文章对您有用,请点个赞;如果对该文章有任何意见及不解之处请留言;谢谢翻阅!!!
——————————————————————————————————————————
看下总体流程图:
ServerApplication工程:
1.服务端ServerApplication 创建AIDL文件:
在包名cn.umbrella.aidl下右键-->new-->AIDL-->AIDL File,创建aidl文件IUmBrellaService,android studio会把aidl文件统一自动放到main/aidl目录下
IUmBrellaService.aidl:
重新rebuild工程下,这个aidl文件就会自动生成IUmBrellaService.java文件,在build/generated/source/aidl/debug/目录下:
这个java包括了静态抽象Stub类,以及私有Proxy,这是客户端client和服务端Service 通过binder驱动通讯用。
2、提供外部绑定的service以及在XML上声明权限:
ServerService.java:
其中onBind返回的对象IBinder给客户端client 绑定服务成功回调函数onServiceConnected。
XML声明permission和action:
这样服务端server就完毕,接下来我们看客户端client如何绑定:
3、客户端client同样需要创建一样的aidl文件,并且路径都一致,重新rebuild下,也会自动在build/generated/source/aidl/debug/生成IUmBrellaService.java文件,内容都一致。
绑定bindservice:
其中onServiceConnected(ComponentName name, IBinder binder) 的参数binder就是客户端绑定服务端ServerService 成功后onBinder返回的对象,在这边把binder改造成IUmBrellaService.Stub的Proxy类,即 mServerSerivce = IUmBrellaService.Stub.asInterface(binder)
这样绑定成功后,客户端client就可以调用服务端server提供的接口即:
对比startservice,使用bindservice相对来说中度耦合,可短时间内密集通讯,识别呼叫端、可回传实行结果及listener回调、service进程crash,呼叫端可以收到died,容错处理,bindservice成功后,调用接口就不会再通过ActivityManagerService了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)