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文件解析
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>
相关文章推荐
- Android开发之AIDL的使用一--跨应用启动Service
- 如何使用Android SDK开发Android应用
- 使用intellij开发android应用
- 原创:Android应用开发记录-Andorid歌词秀(3)使用的Service的音频播放器
- Android 应用开发 第三讲:Android模拟器的使用
- Android应用开发中如何使用隐藏API
- 转:Android应用开发中如何使用隐藏API
- Android SDK开发指南(翻译)系列三:Tools(一)--使用AIDL, 设计一个远程接口
- 使用Google Map Api在Android平台上开发地图应用2
- 如何使用Android SDK开发Android应用?
- Flash Mobile)使用Flash Builder “Burrito”开发Android应用的入门教程
- 如何使用Android SDK开发Android应用
- 如何使用android SDK开发android 应用
- 如何使用Android SDK开发Android应用?
- Window下使用android NDK开发Android应用-入门篇
- 使用命令行方式开发Android应用
- 【Android开发基础】应用界面主题Theme使用方法
- Android 应用软件开发(十)Handler使用
- android 应用开发揭秘,ndk使用过程总结
- Android应用开发中如何使用隐藏API(转)