android进程间通信-AIDL

Android进程间通信可以参考android-进程间通信

这里着重介绍一下AIDL。

这里只是记录一下我自己的实现过程,例子本身不重要,重要的是知道怎么做。。。

总体来说分三步:创建AIDL,创建服务端,创建客户端。

一、创建AIDL

1.在java目录下创建一个包名com.ps.sevenaidldemo.aidl随便取),然后创建Book.java实体类,这个实体类必须实现Parcelable接口,用于序列化和反序列化

android进程间通信-AIDL_第1张图片

 

2.新建aidl文件夹,跟java同级别,然后在这个文件夹下创建跟实体类同名的aidl文件及其他aidl接口文件。

android进程间通信-AIDL_第2张图片

3.Rebuild项目,生成Binder的java接口文件。

我在Rebuild时,出现如下错误:

Process 'command ' C:\Users\ps\AppData\Local\Android\Sdk\build-tools\28.0.3\aidl.exe'' finished with non-zero exit value 1

 

android进程间通信-AIDL_第3张图片

 

这是因为导入的包名不对。

将包名改为:package com.ps.sevenaidldemo.aidl;

相应的,IBookManager.aidl,和 OnNewBookAddListener.aidl中也需要将包名改正确。

另外,IBookManager.aidl 和 OnNewBookAddListener.aidl中用到了Book类,虽然在同一包下,但是还是需要导入,这里只能手动导入。

android进程间通信-AIDL_第4张图片

 

android进程间通信-AIDL_第5张图片

确保需要的包全部导入正确,然后就可以Rebuild通过了,这样就生成了Binder的java接口文件。

 

android进程间通信-AIDL_第6张图片

 

二、创建服务端(Service)

创建Service,在onBind方法中返回Binder实例对象,并实现aidl接口方法。

android进程间通信-AIDL_第7张图片

 

服务端是Service的典型实现,以上需要注意的点:

在onBind方法中,最好添加访问权限的判断,防止一些恶意的访问,可使用 Permission 验证,在 manifest 中声明。

创建Binder 对象时,不能使用new Binder ()的方式,必须使用new IBookManager.Stub()创建Binder对象,这是AIDL接口文件自动生成的Binder对象。

 

服务是四大组件之一,需要在清单文件中注册




    
    
    
    

    
        
            
                

                
            
        

        
        

    

 

三、创建客户端

绑定远程服务后,通过ServiceConnection得到代理对象Binder,同时将Binder对象转换成AIDL接口,然后通过AIDL接口去调用服务端的方法。

注意:

  1. 在得到代理对象Binder时,不能直接使用强转的方式,否则会报类型转换异常,必须使用IBookManager.Stub.asInterface()得到AIDl接口文件生成的Binder对象。
  2. 需要得到一个AIDL实例对象时,应使用.Stub()方法得到。

通过以上操作就可以实现AIDL功能了,运行后结果如下:

android进程间通信-AIDL_第8张图片

 

2019-03-21 16:33:21.853 11024-11024/com.ps.sevenaidldemo E/MainActivity: 连接服务成功

2019-03-21 16:33:23.854 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书1'}

2019-03-21 16:33:25.858 11024-11038/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书2'}

2019-03-21 16:33:27.858 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书3'}

2019-03-21 16:33:29.859 11024-11038/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书4'}

2019-03-21 16:33:31.860 11024-11037/com.ps.sevenaidldemo E/MainActivity: onNewBookAdd: Book{bookName='新书5'}

2019-03-21 16:33:31.864 11024-11038/com.ps.sevenaidldemo E/MainActivity: onAllBook: [Book{bookName='遮天'}, Book{bookName='斗破苍穹'}, Book{bookName='坏蛋是怎样炼成的'}, Book{bookName='新书1'}, Book{bookName='新书2'}, Book{bookName='新书3'}, Book{bookName='新书4'}, Book{bookName='新书5'}]

 

通过以上三步操作,就实现了AIDL。

 

你可能感兴趣的:(Android)