使用aidl自动生成IBinder接口


aild的写法:
1.package 包名;
2.import <任何非默认类型的类,包括同一包下的>;
3.接口中的数据类型只能是:

  • 基本数据类型,String和CharSequence,List(ArrayList),Map(HashMap),Parcelable,AIDL
  • 若用到自定义的Parcelable类,需要新建同名aidl文件

    // Book.aidlimport com.gaoxiang.android.test.aidl;parcelable Book;
    // Book.javapackage com.gaoxiang.android.test.aidl;import android.os.Parcel;import android.os.Parcelable;public class Book implements Parcelable {    // 省略}
  • 除了基本数据类型,其他类型的参数必须标上方向:in(输入型), out(输出型), inout(输入输出型)
  • aidl接口只支持方法,不支持声明静态常量

    // IBookManager.aidlinterface IBookManager {    List getBookList();    void addBook(in Book book);    void registerListener(IOnNewBookArrivedListener listener);    void unregisterListener(IOnNewBookArrivedListener listener);}

4.build之后,在同一包下,系统自动生成IBookManager.java

直接利用aidl方式实现IPC


  • aidl包:
    首先新建aidl包,新建所需的Parcelable类,定义用到的aidl接口,build后自动生成aidl接口,将aidl
    包复制到服务端应用和客户端应用。

  • 服务:

(1) anifest允许外部应用访问`android:exported=”true”

<service     android:name=".service.BookManagerService"     android:enabled="true"     android:exported="true"     android:process=":remote"> service>

(2) 定义实例实现aidl接口中的抽象方法

private Binder mBinder = new IBookManager.Stub() {    @Override    public List getBookList() throws RemoteException {        return mBookList;    }    @Override    public void addBook(Book book) throws RemoteException {        mBookList.add(book);    }    @Override    public void registerListener(IOnNewBookArrivedListener listener) throws RemoteException {        mListenerList.register(listener);    }    @Override    public void unregisterListener(IOnNewBookArrivedListener listener) throws RemoteException {        mListenerList.unregister(listener);    }};

(3) 重写IBinder onBind(Intent)方法,返回aidl接口的实现类

@Overridepublic IBinder onBind(Intent intent) {    return mBinder;}   
  • 客户端:

(1) 新建ServiceConnection实例,实现onServiceConnected()

public void onServiceConnected(ComponentName name, IBinder service) {    // 通过asInterfac(IBinder)获得服务端的aidl接口的实现类    mBinderPool = IBinderPool.Stub.asInterface(service);    // 省略}

(2) 绑定服务

Intent intent = new Intent();// 应用包名,和服务包名intent.setComponent(new ComponentName("com.gaoxiang.android.test",    "com.gaoxiang.android.test.service.BookManagerService"));bindService(intent, mConnection, Context.BIND_AUTO_CREATE);

参考资料


[1] 《Android开发艺术探索》, 任玉刚. https://book.douban.com/subject/26599538/

更多相关文章

  1. 6.9 Android(安卓)支付宝 开发者平台申请和接口调用
  2. Android(安卓)补间动画使用记录
  3. Android完美处理RecyclerView实现item条目点击事件处理
  4. Android2.2添加Ethernet 框架支持(一)
  5. Android(安卓)进程间通信AIDL学习
  6. ①Android(安卓)NuPlayer播放框架
  7. Android(安卓)MVP 模式应用实例
  8. Android(安卓)Java(2015-6-18 15:28、2016-1-30 21:18、2016-5-31
  9. android studio 中好用的插件————你值的拥有

随机推荐

  1. 2018最新大厂Android面试真题
  2. Android(安卓)HAL 开发 (1)
  3. 【Android】Android中Intent的用法总结
  4. [转]Android(安卓)上百实例源码分析以及
  5. 单元测试--Android单元测试学习总结(junit
  6. 实现对特定内容改变字体颜色的TextView
  7. Android(安卓)NDK 开发教程三:Hello JNI
  8. 5款最常用的Android测试框架
  9. android学习——GridView实现主界面布局
  10. Flutter 配置打包