aidl学习
来源:互联网 发布:java代码漏洞扫描工具 编辑:程序博客网 时间:2024/06/05 07:23
今天学习了android中aidl开发,即通过aidl实现android中两个进程之间的通信,我们通过在服务端利用aidl文件暴露接口,然后再客户端通过ServiceConnection来绑定这些接口,进而实现调用。
首先新建服务端工程:
2.在com.example.aidlservice包下,新建一个ICat.aidl文件,内容如下:
package com.example.aidlservice;interface ICat{String getColor();double getWeight();}此时,ADT会在gen目录下,自动生成ICat.java文件
接下来定义一个Service实现类,该Service的onBind()方法所返回的IBinder对象就是ADT生成的ICat.Stub的子类的实例
收先定义一个类继承自stub,需要实现刚才在ICat.aidl中定义的方法:
public class IcatBinder extends Stub {@Overridepublic String getColor() throws RemoteException {// TODO Auto-generated method stubreturn colors[(int)(Math.random()*3)];}@Overridepublic double getWeight() throws RemoteException {// TODO Auto-generated method stubreturn weights[(int)(Math.random()*3)];}}需要在onBind方法中返回该IcatBinder的实例对象,IcatBinder对象可以在onCreate中实例化
另外还需要在AndroidManifest.xml中,配置该service
<service android:name="com.example.aidlservice.AidlService"> <intent-filter> <action android:name="com.example.action.myaidl"/> </intent-filter> </service>这里需要注意的是,这里的action,是用来在客户端绑定该service用的
接下来就是新建客户端工程访问AIDLService
AIDL定义了连个进程之间通信的接口,因此不仅服务端需要AIDL接口,客户端同样需要之前定义的AIDL接口,将之前定义的接口拷贝到客户端的和服务端同名的包内:
即在客户端新建一个包名称和服务端存放ICat.aidl同样包名的包:com.example.aidlservice ,然后需要将服务端的ICat.aidl文件拷贝过来
客户端绑定是通过ServiceConnection实现的:
首先声明绑定的代理:private ICat catService;
然后实现:ServiceConnection
private ServiceConnection conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName arg0) {// TODO Auto-generated method stubcatService = null;}@Overridepublic void onServiceConnected(ComponentName arg0, IBinder service) {// TODO Auto-generated method stubcatService = ICat.Stub.asInterface(service);}};接下来就可已调用服务端的方法了:catService.getColor()
===================================================================
下面看看在客户端和服务端传递自定义的数据类型:
需要注意的是,我们自定义的数据类型,如果需要在客户端和服务端之间传递,那么需要实现Parcelable接口:
我们新建一个Person类实现Parcelable接口:
重写writeToParcel方法:
@Overridepublic void writeToParcel(Parcel dest, int arg1) {// TODO Auto-generated method stubdest.writeInt(personId);dest.writeString(personName);dest.writeString(personPass);dest.writeInt(personAge);}并且需要新建一个CREATOR的实例变量,这个变量的类型必须是:public static final Parcelable.Creator<Person>这样的
这里需要注意的是这个实例变量的名称必须是:CREATOR,这是因为ADT在gen目录下生成的IPerson.java中生成的这样名称
public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {@Overridepublic Person createFromParcel(Parcel arg0) {// TODO Auto-generated method stubPerson person = new Person(arg0.readInt(),arg0.readString(),arg0.readString(),arg0.readInt());return person;}@Overridepublic Person[] newArray(int arg0) {// TODO Auto-generated method stubreturn new Person[arg0];}};
当person类声明好了以后,首先需将该类进行定义:
在存放aidl文件的包下,新建一个Person.aidl文件,内容如下:
parcelable Person;
然后新建需要暴漏给客户端调用的接口:
新建一个Iperson.aidl,内容如下:
package com.example.aidlservice;import java.util.List;import com.example.aidlservice.Person;interface IPerson{List<Person> getAllPerson();Person getPersonById(in int personId);}
这里需要注意的是,必须得引入对应的包名和类,如果需要接受参数,需要需要在需要接受参数的数据类型前边加上in。
需要注意的是:
1.如果需要传递自定义的类型:需要实现Parcelable接口
2.服务端定义的service必须在Manifest.xml文件中声明
3.如果需要传递自定义类型,还需要将自定义类型声明为aidl文件
4.在服务端声明的aidl文件,在客户端必须要有一份相同的文件存在,并且,包名必须相同。这是因为aidl文件就相当于调用的接口,包名必须相同,通过ServiceConnection绑定该接口,然后,通过该aidl生成的接口调用对应的服务端的方法。
源码连接
- aidl 学习
- Aidl学习
- aidl学习
- AIDL学习
- 学习AIDL
- AIDL学习
- 笔记001:Aidl 学习
- android AIDL学习问题
- 学习android aidl
- Service以及AIDL学习
- aidl初步学习
- AIDL的学习
- android学习5:AIDL
- AIDL 使用学习
- AIDL的学习
- AIDL初探以及学习
- Android AIDL 初始学习
- AIDL学习笔记
- Android中Context
- LeetCode (11) Number of 1 Bits
- Four Inages Strategy hdu 5206
- Leapin' Lizards (hdu 2732 最大流)
- poj1001
- aidl学习
- C语言mmap()函数:建立内存映射
- 求矩阵的局部极大值
- JUNHUANGSHIJIA
- HDFS追本溯源:HDFS操作的逻辑流程与源码解析 【SNN对fsimage和editslog文件的合并流程-------很重要】
- 使用DBTestCase子类设置数据库
- 使用CentOS 遇到的问题以及解决方法(持续更新)
- JAVA_SE基础——9.基本数据类型间的转换
- HashMap中 hashcode()方法和equels()方法重写问题