Android应用开发----AIDL的使用

来源:互联网 发布:lua源码 编辑:程序博客网 时间:2024/06/05 05:35

一: 创建AIDL文件    IMyService.aidl

AIDL文件基本数据类型:(int, long, char, boolean等),String和CharSequence,集合接口类型List和Map,不需要import 语句。

Parcelable数据类型: 需要有方向指示,in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。需要import这些类


package com.demo;

import com.demo.Person;

interface IMyService {
        void savePersonInfo(in Person person);
        List<Person> getAllPerson();
}


二: Parcelable文件定义

1- implements Parcelable

2- 实现三个函数

将类数据写入序列化对象dest

 @Override
        public void writeToParcel(Parcel dest, int flags) {
                dest.writeString(a a a);
                dest.writeString(b b b);
                dest.writeInt(c c c);
        }

不需要修改

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


不需要修改,构造器

public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>(){

                @Override
                public Person createFromParcel(Parcel source) {
                        return new Person(source);
                }

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

        };

三:service代码编写

public class RemoteService extends Service {

        private LinkedList<Person> personList = new LinkedList<Person>();
        
        @Override
        public IBinder onBind(Intent intent) {
                return mBinder;
        }

        private final IMyService.Stub mBinder = new IMyService.Stub(){

                @Override
                public void savePersonInfo(Person person) throws RemoteException {
                        if (person != null){
                                personList.add(person);
                        }
                }

                @Override
                public List<Person> getAllPerson() throws RemoteException {
                        return personList;
                }
        };
}


四:使用

Server端:

<service
            android:name="com.example.aidlserver.AidlServerService">
            <intent-filter>
                <action android:name="forServiceAidl"/>
            </intent-filter>
</service>

使用binder连接,调用函数

bindService(new Intent("forServiceAidl"), sc, Service.BIND_AUTO_CREATE);

client端:

将server端的aidl文件,Parcelable文件copy到client端

然后,binder连接service

bindService(new Intent("forServiceAidl"), sc, Service.BIND_AUTO_CREATE);


IPerson.Stub.asInterface(binder);返回的就是可以操作的service对象



五:aidl文件生成的java文件解析

<span style="font-family:SimSun;font-size:14px;color:#333333;">/* * This file is auto-generated.  DO NOT MODIFY. * Original file: /home/user/workspace/AidlServer/src/com/example/aidldefine/IPerson.aidl */package com.example.aidldefine;public interface IPerson extends android.os.IInterface {/** Local-side IPC implementation stub class. */public static abstract class Stub extends android.os.Binder implementscom.example.aidldefine.IPerson {private static final java.lang.String DESCRIPTOR = "com.example.aidldefine.IPerson";/** Construct the stub at attach it to the interface. */public Stub() {this.attachInterface(this, DESCRIPTOR);}/** * Cast an IBinder object into an com.example.aidldefine.IPerson * interface, generating a proxy if needed. */public static com.example.aidldefine.IPerson asInterface(android.os.IBinder obj) {if ((obj == null)) {return null;}android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);if (((iin != null) && (iin instanceof com.example.aidldefine.IPerson))) {return ((com.example.aidldefine.IPerson) iin);}return new com.example.aidldefine.IPerson.Stub.Proxy(obj);}@Overridepublic android.os.IBinder asBinder() {return this;}@Overridepublic boolean onTransact(int code, android.os.Parcel data,android.os.Parcel reply, int flags)throws android.os.RemoteException {switch (code) {case INTERFACE_TRANSACTION: {reply.writeString(DESCRIPTOR);return true;}case TRANSACTION_setName: {data.enforceInterface(DESCRIPTOR);java.lang.String _arg0;_arg0 = data.readString();this.setName(_arg0);reply.writeNoException();return true;}case TRANSACTION_getName: {data.enforceInterface(DESCRIPTOR);java.lang.String _result = this.getName();reply.writeNoException();reply.writeString(_result);return true;}}return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.example.aidldefine.IPerson {private android.os.IBinder mRemote;Proxy(android.os.IBinder remote) {mRemote = remote;}@Overridepublic android.os.IBinder asBinder() {return mRemote;}public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR;}@Overridepublic void setName(java.lang.String name)throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeString(name);mRemote.transact(Stub.TRANSACTION_setName, _data, _reply, 0);_reply.readException();} finally {_reply.recycle();_data.recycle();}}@Overridepublic java.lang.String getName() throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();java.lang.String _result;try {_data.writeInterfaceToken(DESCRIPTOR);mRemote.transact(Stub.TRANSACTION_getName, _data, _reply, 0);_reply.readException();_result = _reply.readString();} finally {_reply.recycle();_data.recycle();}return _result;}}static final int TRANSACTION_setName = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);static final int TRANSACTION_getName = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1);}public void setName(java.lang.String name)throws android.os.RemoteException;public java.lang.String getName() throws android.os.RemoteException;}</span>




0 0
原创粉丝点击