Android的AIDL实现进程间通信

Android系统使用AIDL(Androidinterface description language )实现进程间的通信,例如一个服务端应用程序和一个客户端运用程序之间进行通信,服务端采用service组件提供后台服务,客户端则可用Activity一些组件供用户进行操作。使用AIDL的步骤:

1. 分别创建客户端和服务端项目,

注意包名不能相同

2. 在Server项目中,删除Activity类和清单中的配置

3. 在Server项目中,创建类,继承Service,

覆写绑定方式的生命周期方法

4. 创建一个aidl接口,以小写aidl为扩展名

在接口中定义回调方法,该方法可供客户端访问,实现客户端对服务端的操作。

注意:1. aidl文件中不能出现访问限定符

2. aidl文件在两个项目中要完全一致

3. aidl文件的语法类似于Interface

5. 把aidl文件复制到客户端项目,注意包名要一致

6. 在Service中,创建一个类,继承aidl生成接口的Stub类,同时实现其抽象方法。

例如: class MyBinderextends IMyService.Stub

7. 在服务的清单文件中,配置Service的Action

例如:

<service android:name="AIDLService">

<intent-filter >

<action android:name="com.action.ACTION_AIDL"/>

</intent-filter>

</service>

8.. 在Service中的onCreate()方法中

创建Binder的实例,并在onBind()

方法中返回该实例

例如:

@Override

public void onCreate() {

super.onCreate();

mBinder= new MyBinder();

Log.d("AIDL","Server:onCreate()");

}

@Override

public IBinder onBind(Intentintent) {

Log.d("AIDL","Server:onBind()");

returnmBinder;

}

9.. 客户端的布局main.xml文件中增加按钮,分别设置监听事件。

并在代码中注册按钮的监听事件

10. 在onserviceConnected()方法中得到aidl接口实例

的方法是:      IMyService binder =IMyService.Stub.asInterface(service);

注意onServiceConnection方法参数中的Ibinder不是IMyService.Stub类型,不能直接向上转型,只能使用方法IMyService.Stub.asInterface(service)获得一个实现了IMyService接口的类型对象,其类型为IMyService.Stub.Proxy。

11. 通过binder调用接口中定义的方法来实现对远程服务的控制

AIDL只支持基本数据类型,以及String,List Map ,接口中定义的方法可带参数,同时可返回结果,非基本数据类型定义方法,包括in,out,inout ,in 指客户端输入,out指服务端输出,对于基本数据类型默认为in。除了这些数据类型,如果想使用自己定义的类型,必须得实现Parcelable接口,同时创建一个相同名称以aidl为扩展的文件,例如自定义Person类型,得有两个文件:Person.java  ,Person.aidl

假设包名为com.aidl,则Person.aidl的代码:

packagecom.aidl;

parcelablePerson;

Person.java文件中该类得实现Parcelable接口例如代码为:

packagecom.aidl;

importandroid.os.Parcel;

importandroid.os.Parcelable;

publicclass Person implements Parcelable{

private int age;

private String name;

public Person(){

}

private Person(Parcel in){

readFromParcel(in);

}

public void readFromParcel(Parcel in){

age = in.readInt();

name = in.readString();

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public int describeContents() {

// TODO Auto-generated methodstub

return 0;

}

@Override

public void writeToParcel(Parcel out,int flags) {

// TODO Auto-generated methodstub

out.writeInt(age);

out.writeString(name);

}

public static finalParcelable.Creator<Person> CREATOR = new

Creator<Person>(){

public Person[] newArray(intsize) {

return newPerson[size];

}

public PersoncreateFromParcel(Parcel in) {

return newPerson(in);

}

};

}

类中得有一个Parcelable.Creator类型的静态常量CREATOR。

在接口在要使用自定义的类型得使用import导入,例如定义一个IMyService.aidl文件:

package com.aidl;

import com.aidl.Person;

interface IMyService {

Stringcallback(in List<String> list, inString s ,in Person person);

}

最后将该包下的文件连同包名拷到客户端程序,实现进程间的通信。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wysfwp.html