Android 系统开发提供Api供三方应用(一、跨线程通信)
针对framework开发学习了一段时间,但是现在还是停留在通过在源码里面发送广播来通知我们上层的应用呢,所以接下来的日子,就要把framework层的功能进行修改,然后外部封装一个jar接口包,提供给上层应用进行使用,学习从现在开始。
framework中添加系统aidl服务供app调用,其中两个主要的类是少不了的,一个aidl文件,一个是service,而为了模仿系统源码的实现我们可能需要了解三个类,第一就是Manager(例如:PowerManager.java),第二就是aidl文件(例如IPowerManager.aidl),第三就是PowerManagerService.java。
参考:1、https://blog.csdn.net/qq_36713816/article/details/69665968
2、https://blog.csdn.net/visionliao/article/details/109352228
由于是新手小白,看了一下上面的代码,一头雾水,那么就从零开始,一个一个研究,先从aidl夸进程通信开始
夸进程通信,可以理解成A应用是服务端,B应用是客户端,我们先实现第一步B客户端来读取应用端的数据;
一、服务端(A应用)
1、 项目包名处右键---> new --->选择AIDL
编写文件添加一个带参数的返回方法,写了一个简单的方法getName();
这样我们的aidl类就编写完成了,但是需要注意的是:$\color{red}编写完成之后一定要ReBuild一下项目$,编译一下这个类,编译好的类大家可以去debug文件夹中找到,然后看看
2、实现类Service的创建
继承系统的Service,并建立一个内部类继承IPersonManager.Stub,当客户端请求要获取名字时我们这里把names给到客户端。
3、在A(服务端)应用中注册Service
<service
android:name="com.fir.systemsingletest.PersonService"
android:enabled="true"
android:exported="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.fir.systemsingletest.aidl.AIDL_SERVICE" />
</intent-filter>
</service>
这个就不用说了,咱们自己的应用创建的服务一定的注册,而到后面我们开始做framework开发的时候我们要注册一个Service就麻烦了,后面在讲。
二、应用端(B应用)
1、aidl文件在Server端存放的路径,下图为复制到B端(服务端)aidl文件的路径,这里要保持一致,因此客户端端需要针对Server端的包名新建一个Package。(这里粘贴复制就好,别改)
注意:红色圈出来的部分2、编写用户端B的请求代码
先通过action的方式启动一下服务端的Service,在onServiceConnected方法中拿到IPersonManager的代理对象,最终获取到 name,与服务端数据一致。
3.$\color{red}当我们启动项目的时候,如果在Activity中IPersonManager找不到报出异常,请在app的build.gradle中添加aidl文件指名目录,如本例中添加$
sourceSets{
main {
aidl.srcDirs = ['src/main/aidl','src/main/java']
}
}
版权声明:本文为CSDN博主「木头小颖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_36713816/article/details/69665968
日志如下:
稍微进阶一下,模拟类似网络请求,有请求有应答,其实很简单就是修改一下,aidl的方法
客户端修改:
服务端修改:
一个简单的跨进程之间的通信就写好了