今天学习了Service和AIDL跨进程通信
AIDL,全称是Android Interface Define Language
1、将as切换到Project下,按照如图所示创建文件夹命名为aidl,在aidl文件夹下创建aidl文件,命名为IMyAidlInterface.aidl
![](https://img-blog.csdnimg.cn/img_convert/a0604b83c0be9cab3dfd85a40a1be6ad.png)
2、修改aidl文件,提供一个方法,该方法 就是处理客户端的请求
![](https://img-blog.csdnimg.cn/img_convert/966544bd4b43a638ae46768e7d277e59.png)
rebuild project之后会发现自动生成一个Java文件:IMyAidlInterface.java
![](https://img-blog.csdnimg.cn/img_convert/4a10732f8578ddd0029b663a1c7960b2.png)
4.在服务端中新建一个类,继承Service,在其中定义一个IBinder类型的变量iBinder,引用上述接口IMyAidlInterface.java类中的Stub类对象,实现其中的add方法,在Service的onBind方法中,返回iBinder变量
![](https://img-blog.csdnimg.cn/img_convert/8d1625bde0a29332750a36f26e8227af.png)
5.清单文件中注册SErverService服务,在注册时应设置exported属性为true,保证该Service能被其他应用调用,否则会报
java.lang.SecurityException: Not allowed to bind to service Intent 异常。
![](https://img-blog.csdnimg.cn/img_convert/f64c5ef666c19c6316cb0f46b9909fcf.png)
![](https://img-blog.csdnimg.cn/img_convert/18714555948a890b68774e20e46c85c5.png)
写前台服务
1.在客户端创建同样AIDL文件,要求包名AIDL名字必须一致,内容也必须一样提供add方法,rebuild 项目
![](https://img-blog.csdnimg.cn/img_convert/8269f2c8f1a80231db2cf0765beac69d.png)
Java代码,绑定服务调用服务器进程的方法
![](https://img-blog.csdnimg.cn/img_convert/811317722dbc0e23a6712774eccef271.png)
![](https://img-blog.csdnimg.cn/img_convert/539d9afbd8ee0576659598b55eeebfb0.png)
![](https://img-blog.csdnimg.cn/img_convert/98ef2e3c6e31417be31371e2f145552f.png)
客户端给服务器发信息
发送
![](https://img-blog.csdnimg.cn/img_convert/c260a4aede54beb1e71180ee71584fce.png)
接收
![](https://img-blog.csdnimg.cn/img_convert/2463113e9f4e81897954d029c3360338.png)
![](https://img-blog.csdnimg.cn/img_convert/23cf0205b644ba22157c415c7c9b83e4.png)
服务器给客户端发信息
发送
![](https://img-blog.csdnimg.cn/img_convert/b06083061ea3e35df3459d2eef81a7dc.png)
接收
![](https://img-blog.csdnimg.cn/img_convert/ab55b5b39c6a2122a55e6b0e33173981.png)