AIDL : Android Interface Define Language(接口定义语言)

Service中跨进程间通信利器。。。。

一般都会有Client端和Server端(Server端提供服务)

  实现步骤

  1、在Server模块 main文件夹下新建一个aidl文件夹,创建AIDL文件接口,并在Client中相同位置建立相同的包,相同的AIDL文件

  2、编译之后会在build-generate-source下生成一个aidl文件夹

  3、编写Service

public class IRemoteService extends Service {
    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return binder;
    }

    private IBinder binder=new IMyAidlInterface.Stub(){

        @Override
        public int plus(int a, int b) throws RemoteException {
            return a+b;
        }
    };
}

  4、在AndroidManifest文件中注册该Service,并设置Exported属性为true,否则无法被调用

  5、Client中调用 

     Intent i=new Intent();
        i.setComponent(new ComponentName("com.alger.lu_yy.myaidl","com.alger.lu_yy.myaidl.IRemoteService"));//包名及类名
        bindService(i, new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iMyAidlInterface=IMyAidlInterface.Stub.asInterface(service);  //将IBinder转成Aidl接口
                try {
                  int count= iMyAidlInterface.plus(10,2);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }

            @Override
            public void onServiceDisconnected(ComponentName name) {
                iMyAidlInterface=null;
            }
        },BIND_AUTO_CREATE);

   

注意:发现在Aidl文件中是无法引入相关的类的,能传递的类型有:基本数据类型(short除外),List及Map 这些都是无需Import的,当我们需要传递一些自定义的数据类型时?该如何使用呢?

  1、在java文件夹下建立与aidl文件下相同的包,创建相关的类,并实现Parceable接口

public class Person implements Parcelable {
    private  String name;
    private  int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    protected Person(Parcel in) {
       this.age=in.readInt();
        this.name=in.readString();
    }

    public static final Creator<Person> CREATOR = new Creator<Person>() {
        @Override
        public Person createFromParcel(Parcel in) {
            return new Person(in);
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(name);
        dest.writeInt(age);
    }
}

  2、在aidl文件夹下建立相应的Person.aidl文件,里面写入 

    parcelable Person;(parceleable必须要小写)

  3、并且在Aidl文件中传递自定义的数据类型时必须在类型前面加入in out 关键词

  4、同样在Client模块中相同位置建立相同的类及Aidl文件

 

posted on 2016-11-10 09:59  向着大牛奋斗  阅读(220)  评论(0编辑  收藏  举报