AIDL使用笔记
2016-07-05 21:23
357 查看
aidl是 Android Interface definition language的缩写
这个的使用办法是在程序中申请一个service,然后返回一个对应的子类。其他应用通过这个服务获取到该进程的ADIL对象实例,从而使用AIDL通讯。
然后通过ADT生成对应的类。下面的代码是自动生成的。
接下来需要在a.b.c.d的包下生成一个类,用于服务绑定的时候返回。
接下来就是注册服务了。在AndroidManifest.mxl添加
剩下的明天继续补充。
把aidl文件复制到另外一个应用下,使用同样的包名,开始使用服务
绑定服务代码。由于android5开始必须显式绑定,所以必须设置服务包名。
AidlDemo
这个的使用办法是在程序中申请一个service,然后返回一个对应的子类。其他应用通过这个服务获取到该进程的ADIL对象实例,从而使用AIDL通讯。
package a.b.c.d; interface MyAidl { int getAge(String Name); String getSex(String Name); }
然后通过ADT生成对应的类。下面的代码是自动生成的。
/* * This file is auto-generated. DO NOT MODIFY. * Original file: E:\\EW\\Aidl\\src\\a\\b\\c\\d\\MyAidl.aidl */ package a.b.c.d; public interface MyAidl extends android.os.IInterface { /** Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements a.b.c.d.MyAidl { private static final java.lang.String DESCRIPTOR = "a.b.c.d.MyAidl"; /** Construct the stub at attach it to the interface. */ public Stub() { this.attachInterface(this, DESCRIPTOR); } /** * Cast an IBinder object into an a.b.c.d.MyAidl interface, * generating a proxy if needed. */ public static a.b.c.d.MyAidl asInterface(android.os.IBinder obj) { if ((obj==null)) { return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin!=null)&&(iin instanceof a.b.c.d.MyAidl))) { return ((a.b.c.d.MyAidl)iin); } return new a.b.c.d.MyAidl.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_getAge: { data.enforceInterface(DESCRIPTOR); java.lang.String _arg0; _arg0 = data.readString(); int _result = this.getAge(_arg0); reply.writeNoException(); reply.writeInt(_result); return true; } case TRANSACTION_getSex: { data.enforceInterface(DESCRIPTOR); java.lang.String _arg0; _arg0 = data.readString(); java.lang.String _result = this.getSex(_arg0); reply.writeNoException(); reply.writeString(_result); return true; } } return super.onTransact(code, data, reply, flags); } private static class Proxy implements a.b.c.d.MyAidl { 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 int getAge(java.lang.String Name) throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); int _result; try { _data.writeInterfaceToken(DESCRIPTOR); _data.writeString(Name); mRemote.transact(Stub.TRANSACTION_getAge, _data, _reply, 0); _reply.readException(); _result = _reply.readInt(); } finally { _reply.recycle(); _data.recycle(); } return _result; } @Override public java.lang.String getSex(java.lang.String Name) 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); _data.writeString(Name); mRemote.transact(Stub.TRANSACTION_getSex, _data, _reply, 0); _reply.readException(); _result = _reply.readString(); } finally { _reply.recycle(); _data.recycle(); } return _result; } } static final int TRANSACTION_getAge = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); static final int TRANSACTION_getSex = (android.os.IBinder.FIRST_CALL_TRANSACTION + 1); } public int getAge(java.lang.String Name) throws android.os.RemoteException; public java.lang.String getSex(java.lang.String Name) throws android.os.RemoteException; }
接下来需要在a.b.c.d的包下生成一个类,用于服务绑定的时候返回。
package a.b.c.d; import java.util.ArrayList; import java.util.List; import android.os.RemoteException; public class MyAidlObject extends MyAidl.Stub { class person{ int age; String nameString; String sexString; } List<person> data = new ArrayList<person>(); public MyAidlObject() { // TODO Auto-generated constructor stub person a= new person(); a.age = 20; a.nameString="Jack"; a.sexString = "M"; data.add(a); a= new person(); a.age = 30; a.nameString="Orz"; a.sexString = "W"; data.add(a); a= new person(); a.age = 40; a.nameString="Fzzz"; a.sexString = "M"; data.add(a); a= new person(); a.age = 50; a.nameString="Lucy"; a.sexString = "W"; data.add(a); } @Override public int getAge(String Name) throws RemoteException { // TODO Auto-generated method stub for(person p :data){ if(Name.equals(p.nameString)) return p.age; } return -1; } @Override public String getSex(String Name) throws RemoteException { // TODO Auto-generated method stub for(person p :data){ if(Name.equals(p.nameString)) return p.sexString; } return null; } }
接下来就是注册服务了。在AndroidManifest.mxl添加
<service android:name="com.hhh.myaidl.MyService" android:enabled="true" android:exported="true" > <intent-filter> <action android:name="com.hhh.aidl.myService" /> </intent-filter> </service>
剩下的明天继续补充。
继续
service代码public class MyService extends Service { @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return new MyAidlObject(); } }
把aidl文件复制到另外一个应用下,使用同样的包名,开始使用服务
private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { // TODO Auto-generated method stub aidl = MyAidl.Stub.asInterface(service); handler.post(new Runnable() { public void run() { show.setText("onServiceConnected"); } }); Toast.makeText(MainActivity.this, "MyService connected", Toast.LENGTH_SHORT).show(); } @Override public void onServiceDisconnected(ComponentName name) { // 9e1a TODO Auto-generated method stub aidl = null; handler.post(new Runnable() { public void run() { show.setText(" onServiceDisconnected"); } }); } };
绑定服务代码。由于android5开始必须显式绑定,所以必须设置服务包名。
Intent mIntent = new Intent(); mIntent.setAction("com.hhh.aidl.myService"); mIntent.setPackage("com.hhh.myaidl"); bindService(mIntent, conn, Context.BIND_AUTO_CREATE);
AidlDemo
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories