Android Service AIDL
两个进程间通信可以使用AIDL。
第一个应用服务端,首先写一个AidlService.aidl文件:
package com.example.aidl;
interface AidlService{
String test(String value);
}
interface AidlService{
String test(String value);
}
然后写一个Service:
public class MyService extends Service {
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
Binder binder = new AidlService.Stub() {
@Override
public String test(String value) throws RemoteException {
// TODO Auto-generated method stub
return value;
}
};
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return binder;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
}
Binder binder = new AidlService.Stub() {
@Override
public String test(String value) throws RemoteException {
// TODO Auto-generated method stub
return value;
}
};
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return binder;
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
第二个应用客户端,首先声明和第一个服务端一样的aidl文件,然后:
Intent intent = new Intent(AidlService.class.getName());
bindService(intent, conn, Context.BIND_AUTO_CREATE);
bindService(intent, conn, Context.BIND_AUTO_CREATE);
aidlService.test("test");
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
aidlService= AidlService.Stub.asInterface(arg1);
}
};
开启第一个应用打开后开启服务,第二个应用就能调用第一个服务。从而实现进程间通信。
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
aidlService= AidlService.Stub.asInterface(arg1);
}
};
开启第一个应用打开后开启服务,第二个应用就能调用第一个服务。从而实现进程间通信。
如果需要传递序列化对象,在之前的基础上:
首先,服务端,创建Rectt.aidl文件
package com.example.aidl;
parcelable Rectt;
parcelable Rectt;
之前的AidlService.aidl文件添加
package com.example.aidl;
import com.example.aidl.Rectt;
interface DateService{
String test(String value);
int showRect(in Rectt rectt);
}
import com.example.aidl.Rectt;
interface DateService{
String test(String value);
int showRect(in Rectt rectt);
}
创建类Rectt
public class Rectt implements Parcelable{
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public String toString() {
return "Rect [i=" + i + "]";
}
public Rectt(){
}
public Rectt(Parcel parcel){
i = parcel.readInt();
}
public static final Parcelable.Creator<Rectt> CREATOR = new Parcelable.Creator<Rectt>() {
@Override
public Rectt createFromParcel(Parcel arg0) {
// TODO Auto-generated method stub
return new Rectt(arg0);
}
@Override
public Rectt[] newArray(int arg0) {
// TODO Auto-generated method stub
return new Rectt[arg0];
}
};
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel arg0, int arg1) {
// TODO Auto-generated method stub
arg0.writeInt(i);
}
}
private int i;
public int getI() {
return i;
}
public void setI(int i) {
this.i = i;
}
@Override
public String toString() {
return "Rect [i=" + i + "]";
}
public Rectt(){
}
public Rectt(Parcel parcel){
i = parcel.readInt();
}
public static final Parcelable.Creator<Rectt> CREATOR = new Parcelable.Creator<Rectt>() {
@Override
public Rectt createFromParcel(Parcel arg0) {
// TODO Auto-generated method stub
return new Rectt(arg0);
}
@Override
public Rectt[] newArray(int arg0) {
// TODO Auto-generated method stub
return new Rectt[arg0];
}
};
@Override
public int describeContents() {
// TODO Auto-generated method stub
return 0;
}
@Override
public void writeToParcel(Parcel arg0, int arg1) {
// TODO Auto-generated method stub
arg0.writeInt(i);
}
}
客户端把服务端Rectt.aidl,AidlService.aidl,Rectt.java的拷贝,然后和之前一样通信即可。