设为首页 加入收藏

TOP

Android的AIDL实现进程间通信(一)
2014-11-24 13:19:08 来源: 作者: 【 】 浏览:0
Tags:Android 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


例如:







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 CREATOR = new


Creator(){


首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android多个页面滑动视图实现 下一篇Android:下载后打开PDF格式文件

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: