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>
- Android应用开发----AIDL的使用
- Android AIDL的应用
- Android开发之AIDL的使用
- android aidl的使用
- Android AIDL的使用
- android AIDL的使用
- Android AIDL的使用
- Android AIDL的使用
- Android Aidl的使用
- android aidl的使用
- android AIDL的使用
- Android-AIDL的使用
- Android开发 AIDL使用类型
- Android AIDL的简单应用
- android应用开发详解(十八)---------------------AIDL
- Android AIDL开发Binder应用中注意事项
- Android AIDL使用详解 +整合应用
- android中aidl的使用
- MYSQL学习笔记1
- android中SharedPreferences的用法
- BIEE JavaHost组件启动状态为status
- java中split() 、replace()、 replaceAll()三个函数分析
- POJ 题目1422 Air Raid(二分图最小路径覆盖)
- Android应用开发----AIDL的使用
- 数组操作 指针
- Statement和PreparedStatement之间的区别 [转]
- jquery插件FlexiGrid的使用(已更新)
- vim语法高亮配置
- 笔记83--自定义view--onMesure、MeasureSpec详解
- Android平台语言支持状态(MTK6589)
- 理解遗传算法的例子
- MFC ado数据库:所有表名称