您的位置:首页 > 移动开发 > Android开发

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

2014-11-17 15:32 253 查看
一: 创建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();

}


二: [b]
Parcelable文件定义
[/b]

[b]1- implements Parcelable[/b]

2- 实现三个函数

将类数据写入序列化对象[b][b]dest[/b]
[/b]

[b] @Override

        public void writeToParcel(Parcel dest, int flags) {

                dest.writeString(a a a);

                dest.writeString(b b b);

                dest.writeInt(c c c);

        }
[/b]

[b]不需要修改
[/b]

[b]@Override

        public int describeContents() {

                return 0;

        }
[/b]

不需要修改,构造器


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文件,[b][b]Parcelable[/b]文件copy到client端[/b]

然后,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 implements
com.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);
}

@Override
public android.os.IBinder asBinder() {
return this;
}

@Override
public 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;
}

@Override
public android.os.IBinder asBinder() {
return mRemote;
}

public java.lang.String getInterfaceDescriptor() {
return DESCRIPTOR;
}

@Override
public 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();
}
}

@Override
public 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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: