美文网首页
Android 通过AIDL实现进程间通信

Android 通过AIDL实现进程间通信

作者: 风二叽 | 来源:发表于2019-04-11 19:53 被阅读0次

            前段时间项目用到两个app之间的通信,涉及到了安卓上的跨进程通信,下面就简单写写我在学习这块内容时的认识。

            进程间通信IPC (Inter-Process Communication)是指两个进程传送数据或信号,每个应用程序其实对应着一个进程,都有自己的Dalvik VM实例跟独立的内存,两个应用间通信,简单的举个例子,就像用美团点外卖最后支付的时候,调用支付宝进行支付。要实现进程间通信,可以通过AIDL(Android interface definition language)实现。

            两个应用之间通信是通过Service实现的,在这之前需要先了解Service与Activity之间的通信,不了解的可以先去了解下什么是Service,Activity如何bind 一个Serivce跟bind成功后的回调,这里就不讲基础了,直接上跨进程通信简单例子。

            首先两个app分为Service端跟Client端,Client端通过绑定Service端的服务来跟它进行通信,获取数据或者调用它的方法。

     一. Service端

    我们先创建Service端工程ServiceTest,注册一个Service

            注意,android:enabled="true"   android:exported="true"这两个千万不能漏,添加这两个,外部的应用才能访问到Service。添加<intent-filter>的目的是后续Client设置隐性intent用到的,通过过滤其他app指定action的intent,来启动该服务(简单的说就是MyService可以响应带有com.example.administrator.servicetest.MyService这个action的Intent)。

    新建UserInfo.aidl文件,添加需要的业务方法,代码如下

    在makeProject后会自动生成UserInfo.java文件,这是我们后续需要使用的类

    UserInfo.java中要注意这一行,这个Stub类继承了Binder类并实现了UserInfo接口,所以后续理解为把Stub当作Binder跟UserInfo使用。

    然后新建UserImpl类继承Stub,并重写里面的业务方法,这个UserImpl就可以当作业务对象来进行使用了。

    好了准备工作完成,我们可以编辑MyService了,代码如下,返回的bind变成了UserImpl业务对象

    下面对界面进行简单处理,编辑MainActivity的界面如下,布局文件不贴了

    界面的java代码中两个主要代码如下,一个绑定service,一个给Serivce里的bind对象读取两个EditText里的值,作为给后续Client端读取。

    二,Client端

    新建工程ServiceReceiver,将Service端的aidl文件夹拷贝到Client端,需要连同包路径一并拷过去,我的方法是直接如下图,在工程目录文件夹中复制文件夹拷贝到Client端工程文件夹相同路径下,再makeProject即可。

    Client端的MainActivity:两个主要方法,创建一个intent,action为MyService相应的action,设置MyService的包路径,bind即可,在绑定成功回调中读取MyService里的bind数据,这样就完成了读取Service端两个EditText里的内容,实现跨进程通信。

    相关文章

      网友评论

          本文标题:Android 通过AIDL实现进程间通信

          本文链接:https://www.haomeiwen.com/subject/napxwqtx.html