android AIDL跨应用通信,实现回调监听

android AIDL跨应用通信,实现回调监听

android IPC通信可以使用很多方式实现,包括Messager、Handler、Provider、AIDL、Socket、bundle,下面是引用的网上的一张图片:



       总结一下:其中Bundle是用于进程间的通信,其他的都可用于进程间或者跨进程通信,Messager由于支持的数据格式有限,所以只能进行简单的数据通信,Socket实现起来会比较复杂,但是功能还是很强大的。

        所以最后,AIDL是最合适的选择了,实现起来也很方便,在Android studio 中实现了aidl文件,build之后会在build/generated/source/aidl/debug目录下看到aidl对应的java文件,这个是系统自动帮我们完成的,他的源码也不难,后续会详细讲解。

        我们大多数的需求应该是要传递各种各样的对象或者集合,而不是哪些基本的数据,下面我们一步步来实现。下面是我的服务端的整体结构:


首先,我们创建一个bean类,Book.java,用于后续IPC通信传递的对象。


       这里我实现了Parcelable接口,我们知道,要实现进程间通信,必须实现序列化,实现方式有两种:Parcelable和Serialazable,这里引用网上官方的说法解释一下:

       Serializable的作用是为了保存对象的属性到本地文件、数据库、网络流、rmi以方便数据传输,当然这种传输可以是程序内的也可以是两个程序间的。而Android的Parcelable的设计初衷是因为Serializable效率过慢,为了在程序内不同组件间以及不同Android程序间(AIDL)高效的传输数据而设计,这些数据仅在内存中存在,Parcelable是通过IBinder通信的消息的载体。

       通过上面的解释我们应该知道了,Parcelable接口采用Binder作为通信方式,速度是要快一些的,而Serializable在实现上很简单只需要实现接口即可,不用像Parcelable那样还得自己来实现里面的方法。

         实现了bean类之后,我们可以开始编写aidl文件了,我们在main目录下单独创建一个aidl的文件夹,方便查看,然后创建Book.aidl文件。这里相当于一个媒介,是Book类在AIDL中的声明,不然我们是无法直接使用到Book类的。

                这个实现很简单,就声明一下Book类即可。接下来是最重要的aidl文件的实现IBookInterface.aidl,服务端后面要实现的方法都是在该类中定义。


       我这里实现了addBook、getBookList以及后面两个注册与解注册的方法,就是我们熟悉的监听者模式,监听是否添加了新书,然后主动回调给监听者。IOnNewBookArrivedListener.aidl文件实现的也很简单,就是一个监听方法:


        然后我们把module build一下,完成后我们去build/generated/source/aidl/debug/目录下,会发现我们刚才实现的adil类在这里又出现了,这个是系统帮我们自动实现的方法。

         接下来,我们实现服务端最重要的类,BookServer.java,它是一个服务类,继承了Server,Server就不多说了。下面看一下这个类的具体实现:





       这里就是具体的实现了,其中最主要的就是MyBinder类,在这里面我们实现了aidl的方法。注意,这里我使用的是RemoteCallbackList,这个类我也是第一次使用,是专用于跨进程回调的类,使用起来很方便。大家看一下我各个方法的实现,其实都很简单,因为最复杂的工作系统都已经帮我们做好了。

       服务端的Module就是这些了,接下来就是客户端的实现。

          下面是客户端整体结构:


       注意,aidl文件可以直接从服务端copy过来,整个文件夹一起copy,确保packageName一致,不然是实现不了IPC通信的。然后build一下,系统就会帮我们生成aidl对应的java文件。下面是MainActivity具体的实现:



       因为服务端已经实现了回调监听,所以客户端不需要去关心什么时候会到新书什么时候获取新书,只需要注册监听即可,注册监听我们放在ServiceConnection的onServiceConnected方法中,然后在金廷其中做相应处理即可。整个AIDL通信最基础的实现就是这些了,可以更具项目具体的需求做相应的修改,我只是记录一下自己的做法,有错误的地方还望指正。

你可能感兴趣的:(android AIDL跨应用通信,实现回调监听)