AIDL小結

AIDL : Android Interface Define Language(接口定義語言)java

Service中跨進程間通訊利器。。。。ide

通常都會有Client端和Server端(Server端提供服務)ui

  實現步驟this

  一、在Server模塊 main文件夾下新建一個aidl文件夾,建立AIDL文件接口,並在Client中相同位置創建相同的包,相同的AIDL文件spa

  二、編譯以後會在build-generate-source下生成一個aidl文件夾code

  三、編寫Serviceblog

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;
        }
    };
}

  四、在AndroidManifest文件中註冊該Service,並設置Exported屬性爲true,不然沒法被調用接口

  五、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的,當咱們須要傳遞一些自定義的數據類型時?該如何使用呢?it

  一、在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);
    }
}

  二、在aidl文件夾下創建相應的Person.aidl文件,裏面寫入 

    parcelable Person;(parceleable必需要小寫)

  三、而且在Aidl文件中傳遞自定義的數據類型時必須在類型前面加入in out 關鍵詞

  四、一樣在Client模塊中相同位置創建相同的類及Aidl文件

相關文章
相關標籤/搜索