嗨,大家好,本人菜鸟一枚,写的不对的地方还希望大家多多指正,禁止吐槽哈,新账号,新开端,希望各位小哥哥小姐姐们多多支持,哪怕你轻轻的一个小赞就是对我最大的认可。也是我以后更新博客的动力。以后我会坚持每周更新一篇博客,也会做到每篇博客质量的最大化,好了,废话不多说了,咱们进入正题。
一、进程
首先说说进程是什么,以计算机语言说进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
这么说你可能不太明白那我换个说法:进程是一个具体的应用程序,进程中包括线程,进程中可以有一个或多个线程。一个应用程序可以有一个或多个进程。我们正常的APP基本上都是一个进程,但有部分APP是多进程,那么我们今天要做的事就是进程间通信,如果这两个APP都只有一个进程也可以说是这两个APP间的数据通信。
二、AIDL
AIDL (Android Interface Definition Language)Android接口定义语言,我们可以理解为两个单进程程序之间数据交互的一个接口。接下来使用:
首先我们新建个项目叫AIDLServer,我们可以理解这个APP为服务端,接下来我们在src目录下创建AIDL folder 目录,如果你没有在android studio上找到这个方式,也可以在src目录下右键创建文件夹aidl。
既然文件夹创建了下面就该创建文件了,同样的方式在aidl文件上右键New AIDL AIDL File创建AIDl文件
创建完之后是这样的,它会自动生成一个和项目相同的包结构,我们就以它默认的包名就可以,aidl文件里会有个默认的basicTypes接口,我们一般不用直接删掉就可以。下面说下aidl语法,aidl语法与java及其相识,你可以把它当做java接口编写。
aidl支持的类型有:byte 、short、int、long、float、double、boolean、char、CharSequence、String、List、Map。如果想要使用自定义类型可以使用parcelable关键字。
aidl主要与java不同之处在于定向tag,定向tag是写在参数前面的一种标识,表示这个参数是双向传输还是单向传输。定向tag一共有三个分别为:in、out、inout。其中in你可以理解为java中的输入流也就是客户端往服务端输入,out也就相当于java的输出流,inout意思是输入输出流也就是双向都可以,另外,Java 中的基本类型和 String ,CharSequence 的定向 tag 默认且只能是 in 。不懂的话去搜下java输入输出流。
接下来我们定义一个接口String getData(String inData),接口可以根据自己的业务自己定义。定向tag默认标识为in,我们通过客户端调用getData 传入参数在服务端处理并返回,等下你们也可以把String 改成List或Map试下inout 效果。接口方法定义完之后要Rebuild 或 clear下项目,因为android studio 需要把我们编写的aidl接口编译进项目。
配合server编写接口具体逻辑,可以理解为aidl接口的实现类。
接下来在manifest中为当前server增加android:exported属性,意思是当前服务可以其他应用程序调用。增加Intent-filter name方便其他程序调用,具体如下:
好了,到此为止服务端代码编写完成了,接下来就是客户端的啦。
首先新建项目,并把服务端aidl目录下所有文件复制客户端aidl目录下并builde或clear,记住包名也用复制进来。
好了,运行下,输出效果如下,客户端传入客户端并由服务端处理后返会如下:
总结一下,主要流程分为三步:
1、编写aidl接口。
2、通过Stub编些具体逻辑并通过server onBind方法返回实例。
3、编些客户端通过Stub.asInterface接口获取实例。