为了更好的理解本文,开始先简单介绍下概念。

AIDL:即Android Interface Definition Language,是一种IDL语言,用于生成可以在Android设备上两个进程之间进行进程间通信(interprocess communication, IPC)的代码。大家都知道,android每个程序都有自己独立的运行空间,一个进程通常不能访问另一个进程的内存空间,所以可以想象如果两个应用要进行数据交互操作是何等的不便。AIDL就是为了解决这个问题才诞生的。


适用场景:一般来说,每个APP都是独立的,需要什么服务,在本进程内自己实现,自己调用足以。但是实际开发环境还是有很多这样的情况,比如你们公司是一家专业提供解决方案的公司,为了自己的技术保密性,可能你会提供给客户的只是一个经过混淆加密后的Jar包文件,其中有个Service运行关键的业务代码,再把接口方法以文档形式交付客户调用。很熟悉吧,这时候很你就第一时间就应该想到Remote Service。具体点,相信很多使用百度云服务的同学都注意到了,现在百度开发者平台为android开发者提供的的很多服务都是采用这种方式进行实现的,如百度推送、百度地图定位。


好了,概念背景都介绍清楚了。进入今天说的正题,说了半天的AIDL,那和我们今天的主题Service有何关系呢。可以这么来理解,AIDL定义了进程之间通信的协议,即是接口;Remote Service就是AIDL接口定义的实现,业务逻辑的具体实现,同时也可看作进程交互之间的通道,因为client调用成功的话相当于可以拿到server的Remote Service引用。


代码说话,约定下,调用者是client,被调用者是server。代码都会放在Github上面,地址在最下方


一、定义AIDL接口,俩方法:保存Person,获取Person列表

AIDL服务只支持有限的数据类型,因此,如果用AIDL服务传递一些复杂的数据就需要做更一步处理。AIDL服务支持的数据类型如下:

1、Java八种基本数据类型(int、char、boolean、double、float、short、byte、long)

2、String和CharSequence

3、List和Map。但要注意,List和Map对象的元素类型必须是AIDL服务支持的数据类型

4、AIDL自动生成的接口

5、实现android.os.Parcelable接口的类,实现序列化

其中4和5的类是需要手动导入的,本文的Person对象是实现了Parcelable接口的,所以也需要导包。只导包的话,编译是不会通过,你还需要再新建一个对应的Person.aidl,简单的声明下Person是一个序列化的对象。如下:

好了,server端的aidl定义好了,那接下来就需要完整的把上面的aidl文件和Person类拷贝到client端的代码中,记得包名也一定要相同,不然client调用的时候会找不到server的服务。


二、实现Server端的Remote Service

定义好aidl文件后,编译器会自动帮生成一个接口IRemoteService,其中有个抽象类Stub,其中的抽象方法就是aidl中定义的两个接口方法。


三、manifest注册Remote Service,记得添加action,client会基于action去调用


四、client调用

1、Service绑定

2、service解绑

3、向Server写入数据

4、从server读取数据

通过上面的代码,我们实现了server和client进程间通信,client端可以向server读写数据。写到这里,你或许想起了Android中另一个重要的组件---ContentProvider,也是同样可以实现上述需求,有兴趣的朋友可以去研究下。好了,我们的service系列也完结了,如果你有好的建议想法,欢迎大家通过微信或者开源中国与我交流(ID:Jack_1900)。根据网友的建议,明天为大家献上“Android内存管理之道”。

如果觉得对你有所帮助,欢迎大家订阅我的微信公众账号——Android干货分享。下面是微信的二维码,为你提供及时高质的Android干货。技术交流QQ群:318588906,欢迎大家加群,共同探讨下Android和Java技术,一起壮大我们的微信干货分享社区。

更多相关文章

  1. android使用AIDL跨进程通信(IPC)
  2. android的TextView的TextWatcher使用
  3. Android(安卓)FrameWork——ActivityManager框架
  4. ViewGroup中的onInterceptTouchEvent和onTouchEvent调用时序
  5. Android(安卓)6.0 变更
  6. Android(安卓)Camera HAL浅析
  7. Flutter Android(安卓)Toast Message(flutter访问Android(安卓)T
  8. Mac 打 Android(安卓)包遇到 open too many files 解决办法
  9. Android(安卓)架构

随机推荐

  1. Android简单自定义标题栏
  2. Eclipse中LogCat如何打开
  3. 【Android】viewpager banner 广告 自动
  4. android skia 使用实例
  5. Android Makefile example
  6. android 下载文件图片圆形进度条
  7. android RadioButton 点击时候出现点击声
  8. android 屏幕适配之自动生成多重values
  9. Android开发之自定义PopupWindow记录
  10. android 入门demo 进度条