1.什么是aidl:aidl是 Android Interface definition language的缩写,一看就明白,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口
icp:interprocess communication :内部进程通信
数据提供端
1 编写aidl中传输对象的数据结构(Dog类)
编写aidl文件Dog.aidl
parcelable Dog;
编写java文件Dog.java 实现 Parcelable接口
package com.example.aidl;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
public class Dog implements Parcelable {
private String name;
private int age;
private boolean isMale = false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMale() {
return isMale;
}
public void setMale(boolean isMale) {
this.isMale = isMale;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
boolean[] bs = new boolean[2];
bs[0] = isMale;//boolean类型不能直接写入序列化,借助boolean数组
dest.writeBooleanArray(bs);
}
public static final Parcelable.Creator<Dog> CREATOR = new Creator() {
public Dog createFromParcel(Parcel source) {
// 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
Dog p = new Dog();
p.setName(source.readString());//读写序列化顺序必须和写入顺序一致
p.setAge(source.readInt());
boolean[] val = new boolean[2];
source.readBooleanArray(val);
if (val != null)
p.setMale(val[0]);
return p;
}
@Override
public Dog[] newArray(int size) {
return new Dog[size];
}
};
}
2 编写service.aidl 文件
package com.example.aidl;
import com.example.aidl.Dog;
interface IMyService{
String getValue();
Dog getDog();
}
3 编写service.java文件
package com.example.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.example.aidl.Dog;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
try {
// 虚拟耗时操作,测试客户端需要启动线程访问该接口
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "哈哈哈";
}
@Override
public Dog getDog() throws RemoteException {
Dog dog = new Dog();
dog.setName("Tom");
dog.setAge(2);
dog.setMale(true);
return dog;
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
3 在manifest文件中注册service文件
<service
android:name="com.example.aidl.MyService"
android:process=":remote" >
<intent-filter>
<action android:name="com.example.aidl.IMyService" />
</intent-filter>
</service>
客户端
1 拷贝数据提供端gen文件夹中生成的aidl文件夹和Dog类
2 主界面使用aidl获取数据
private IMyService myService = null;
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("LXL", "disConnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = IMyService.Stub.asInterface(service);
Log.e("LXL", "connected");
}
};
bindService(new Intent("com.example.aidl.IMyService"),
serviceConnection, Context.BIND_AUTO_CREATE);
//注: com.example.aidl.IMyService 是数据提供端在manifest中注册service的action参数
msg = myService.getValue();//这个接口是耗时操作需要放入线程
dog = myService.getDog();
icp:interprocess communication :内部进程通信
数据提供端
1 编写aidl中传输对象的数据结构(Dog类)
编写aidl文件Dog.aidl
parcelable Dog;
编写java文件Dog.java 实现 Parcelable接口
package com.example.aidl;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Log;
public class Dog implements Parcelable {
private String name;
private int age;
private boolean isMale = false;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMale() {
return isMale;
}
public void setMale(boolean isMale) {
this.isMale = isMale;
}
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeInt(age);
boolean[] bs = new boolean[2];
bs[0] = isMale;//boolean类型不能直接写入序列化,借助boolean数组
dest.writeBooleanArray(bs);
}
public static final Parcelable.Creator<Dog> CREATOR = new Creator() {
public Dog createFromParcel(Parcel source) {
// 必须按成员变量声明的顺序读取数据,不然会出现获取数据出错
Dog p = new Dog();
p.setName(source.readString());//读写序列化顺序必须和写入顺序一致
p.setAge(source.readInt());
boolean[] val = new boolean[2];
source.readBooleanArray(val);
if (val != null)
p.setMale(val[0]);
return p;
}
@Override
public Dog[] newArray(int size) {
return new Dog[size];
}
};
}
2 编写service.aidl 文件
package com.example.aidl;
import com.example.aidl.Dog;
interface IMyService{
String getValue();
Dog getDog();
}
3 编写service.java文件
package com.example.aidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import com.example.aidl.Dog;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
try {
// 虚拟耗时操作,测试客户端需要启动线程访问该接口
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "哈哈哈";
}
@Override
public Dog getDog() throws RemoteException {
Dog dog = new Dog();
dog.setName("Tom");
dog.setAge(2);
dog.setMale(true);
return dog;
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
}
}
3 在manifest文件中注册service文件
<service
android:name="com.example.aidl.MyService"
android:process=":remote" >
<intent-filter>
<action android:name="com.example.aidl.IMyService" />
</intent-filter>
</service>
客户端
1 拷贝数据提供端gen文件夹中生成的aidl文件夹和Dog类
2 主界面使用aidl获取数据
private IMyService myService = null;
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName name) {
Log.e("LXL", "disConnected");
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myService = IMyService.Stub.asInterface(service);
Log.e("LXL", "connected");
}
};
bindService(new Intent("com.example.aidl.IMyService"),
serviceConnection, Context.BIND_AUTO_CREATE);
//注: com.example.aidl.IMyService 是数据提供端在manifest中注册service的action参数
msg = myService.getValue();//这个接口是耗时操作需要放入线程
dog = myService.getDog();