service的远程调用

来源:互联网 发布:spps统计软件 编辑:程序博客网 时间:2024/04/28 02:24

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

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内存管理之道”。

0 0
原创粉丝点击