对于客户端和服务之间通信,虽然可以通过Ibinder实现,但需要共享业务实现,如果在进程间通信的haunted,需要使用AIDL(Android Interface Definition Language)进行。
AIDL是一种接口定义语言,用于约束两个进程间的通讯规则,编译器生成代码,实现Android设备上的两个进程间通信(IPC),AIDL的IPC机制和EJB所采用的CORBA很类似,进程之间的通信信息,首先会被转换成AIDL协议消息,然后发送给对方,对方收到AIDL协议消息后在转换成相应的对象。由于进程之间的通信信息需要双向转换,所以android采用代理类背后实现了信息的双向转换,代理类由android编译器生成,对开发人员来说是透明的。
使用方式如下:
1、 定义AIDL(同接口相似,但没有可见性,扩展名有.java—>.aidl)
//IdownloadService.aidl,注意扩展名
package cn.itcast.aidl;
interface IdownloadService{
void download(in/out/input String path);//in|out|inout是参数的方向。
}
Ide会自动在gen包下生成对应的java类,接口文件中生成一个stub的抽象类,里面包括aidl定义的方法,还包括一些其它辅助方法。值得关注的是asInterface(IBinder iBinder),它返回接口类型的实例,对于远程服务调用,远程服务返回给客户端的对象,客户端onServiceConnectionted(ComponentName name,IBinder service)方法引用该对象时不能直接强转成接口类型的实例,而应该使用asInterface(IBinder iBinder)进行类型转换。
编写AIDL需要注意:
1. 接口名和aidl文件相同。
2. 接口和方法前不用加访问权限修饰符public,private,protected等,也不能用final,static.
3. Aidl默认支持的类型包括java基本类型(int,long,boolean等)和(String,List,Map,CharSequence),使用这些类型是不需要import声明,对于List和Map中的元素类型必须是Aidl支持的类型,如果用自定义类型作为参数或返回值,自定义类型必须实现Parcelable接口。
4. 自定义类型的AIDL生成的其它接口类型在aidl描述文件中,应该显示import,即便在该类型和定义的包同一个包中。
5. 在aidl文件中所有非Java基本类型参数必须加上in、out、inout标记,以指明参数是输入参数,输出参数还是输入输出参数。
6.Java原始类型默认的标记位in,不能为其它标记。
Javabean必须实现Parcelable接口
class Person implements Parcelable{
id,name;
public int describeContents(){
return 0;
}
//把javabean中的数据写到Parcel
public void writeToParcel(Parcel dest,int flags){
dest.writeInt(this.id);
dest.writeString(this.name);
}
//添加一个静态成员,名为CREATOR,该对象实现了Parcelable.Creator接口
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){
public Person createFromParcel(Parcel source) { return new Person(source.readInt(), source.readString());
}
public Person[] newArray(int size) {
return new Person[size];
}};
}
在自定义类型包中定义aidl声明文件
//Person.aidl,注意Parcelable是小写
Package cn.itcast.domain;
parcelable Person;
interface cn.itcast.domain.Person;
interface IPersonService{
void save(in Person person);
}
创建aidl接口实现类(通过继承${业务接口}.stub类实现)
Public class ServiceBinder extends IPersonService.Stub{
Public void save(Person person) throws RemoteException{
Log.i(“PersonService”,person.getId()+”=”+person.getName());
}
}
实现service的onBind方法,返回值就是上一步创建的aidl实现类对象。
public IBinder onBind(Intent intent){
return new ServiceBinder();
}
客户端通过隐式意图访问服务。
<service android:name=”.PersonService”>
<intent-filter>
<action android:name=”cn.itcast.process.aidl.PersonService”/>
new Intent(“cn.itcast.process.aidl.PersonService”);
复制aidl文件和所在包到客户端对应的src下。(客户端会自动生成对应java类)
this.bindService(,this.sc,BIND_AUTO_CREATE);
sc = new ServiceConnection(){
public void onServiceConnected(ComponentName,IBinder service){
personService = IPersonService.Stub.asInterface(service);
personService.save(new Person(56,”liming”));
}
public void onServiceDisconnected(ComponetName name){
personService = null;
}
}
Android-结束通话
Android没有对外公开通话的API,如果需要结束通话,必须使用AIDL于电话管理服务进行通行,并调用服务中的API实现结束通话,方法如下:
1. 从Android的源代码中拷贝以下文件到项目中:
com/android/internal/telephony/ITelephony.aidl
android/telephony/NeighboringCellInfo.aidl
如右图所示。开发工具会在gen目录下自动生成ITelephony.java
2. 调用ITelephony.endCall()结束通话:
Method method = Class.forName(“android.os.ServiceManager”)
.getMethod(“getService”,String.class);
IBinder binder = (IBinder)method.invoke(null,new Object[]{TELEPHONY_SERVICE});
ITelephony telephony = ITelephony.Stub.asInterface(binder);
Telephony.endCall();
在清单文件AndroidManifest.xml中添加权限
<uses-permission android:name=”android.permission.CALL_PHONE”/
>
相关推荐
AIDL----Android进程间通信(IPC)浅析测试代码,注释非常详细
Android使用AIDL实现进程间通信
定义进程间的通信接口,实现多个应用程序之间建立共同的服务机制,通过AIDL在不同应用程序之间达到数据的共享和数据相互操作
andorid 不同进程间的通信, uses the aidl to comple the demo,hope you can learn ,and give me you idear .
AndroidAIDL进程间通信例子代码,一个客户端调用,一个服务端Service
Android安卓AIDL进程间通信Service简单例子,分为客户端和服务端代码,一看就会,一看就懂,核心还是IBinder.
NULL 博文链接:https://android-zhang.iteye.com/blog/1850180
Android aidl 实现进程间通信(IPC)
Android中使用aidl在进程间通信(IPC),2个项目的源码,可以直接运行
使用Android studio 实现两个app通过AIDL 和Binder连接池的进程间通信
使用AIDL完成进程间的简单通信
android根据不同任务创建不同进程,并通过AIDL进行进程间通信
Android进程间通信 AIDL Service 一、服务端结构 服务端需要处理的有: 1.处理对象,对象内方法,注意:AIDL 只能对函数起作用; 2.处理服务; 3.配置文件; 二、客户端 配置 1.对象,切记,与服务端的对象完全一致...
IPCCommunication是通过两种方式实现进程间通信,一种是手写binder实现进程间通信,互相传递使用Bunder,可以在Bunder中自定义协议,另外一种是基于Message,客户端与服务端之间使用Message进行通信;
Android之通过AIDL机制实现进程间的通讯实例,详见http://blog.csdn.net/lvxiangan/article/details/52756199
使用AIDL实现进程间通信 两个工程即两个APP,实现数据共享 APP1中有个service 不停的对某一个数进行++操作, APP2通过AIDL 获取APP1的Service中的这个值(通过回调) 当然要使用AIDLAPP1中也要做相应处理
一个例子工程,主要介绍AIDL的使用和原理浅析
本人根据开发艺术探索这本书,深入学习跨进程通信,对AIDL终有所成,资源中是代码,里面几乎每一行都进行注解,一个不错的资源,用于以后忘记时候取过来看一下
Aidl进程间通信简单封装了下,AIDL和Service作为一个library,其他3个app调用,实现3个app共享一个服务,3个中任意app打开即可开启服务,其他两个app共用