美文网首页Android开发经验谈Android知识终端研发部
Android AIDL 教程 (一)—— 简单的示例

Android AIDL 教程 (一)—— 简单的示例

作者: 程序员徐公 | 来源:发表于2017-11-04 16:47 被阅读487次

    AndroidStudio 引用 aidl 文件的两种方法

    Android AIDL 教程 (一)—— 简单的示例

    Android AIDL 传递对象(Parceable)

    AIDL(Android Interface Definition Language)是Android系统自定义的接口描述语言。可以用来实现进程间的通讯。

    在 Android 中,要实现进程间的通讯,一般来说,有以下几种方式:

    • 使用 Bundle

    最常见的的是我们通过特定的 Action 或者 data 启动另外一个应用的 Activity 或者 service。我们可以将要传递的数据封装在 bundle 当中。

    • 文件共享

    两个应用读取某个文件,从而达到进程通讯的问题,不过这种方法需要处理好文件锁的问题,不然很容易引发数据错乱。

    • 使用 Messenger

    Messenger 进行进程间的通讯是串行的,而且是单向的,如果客户端和服务端想进行双向通讯,需要维护两个 Messenger,相对比较麻烦

    • 使用 AIDL

    AIDL 简介

    aidl 一般用来进程通讯。一般来说,主要有两种角色,客户端 (Client)和服务端(Server)。

    服务端

    一般用来处理客户端的请求,他把与客户端通讯的方式抽象成接口,并编写成 AIDL 文件。
    通常服务端需要实现一个 Service,来处理客户端的请求

    客户端

    通常我们需要将服务端 的 AIDL 文件 copy 过来,并通过 Intent 的方式来启动我们服务端的 Service。

    接下来让我们一起来实现一个简单功能,通过一哥 app(Clilent) 唤起另外一个 APP (Server),并进行两者之间的通讯。首先,我们先来看一下服务端的实现。


    服务端的实现

    服务端的实现,一般来说,需要以下步骤:

    • 将请求抽象成接口,并编写 aidl 文件;
    • 编写一个 Service,实现接口,处理客户端的请求,并将 binder 返回回去;
    • 在 AndroidManifet 配置 Service,将我们的 Service 暴露出去。

    将请求抽象成接口,编写 aidl 文件

    一般来说, AIDL 文件支持以下类型

    • Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
    • String
    • CharSequence
    • List
      List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List<String>)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。
    • Map
      Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map(如 Map<String,Integer> 形式的 Map)。 另一端实际接收的具体类始终是 HashMap,但生成的方法使用的是 Map 接口。
    • 实现 Parceable 的自定义类型

    注意事项

    • 在 aidl 文件中,除了 Java 编程语言中的所有原语类型、String、CharSequence、List、Map,其他在 AIDL 文件中用到的类,你必须使用 import 语句导入,否则会报错。
    • 当你使用实现Parceable 的自定义类型的时候,当其作为参数的时候,你必须为其制定是输入或者是输出参数。
    in 表示输入参数,即服务端可以修改该类型
    out 表示输出参数,即客户端可以修改该类型,客户端不行
    inout  表示客户端和服务端都可以修改该类型
    

    void onSuccess(int code,in MusicInfo musicInfo);
    

    有人可能会这样想,既然 inout 表示客户端和服务端都可以修改该类型,那我们平时在写 aidl 文件的时候,直接在方法参数前面加上 inout 修饰就 OK了,省得去区分。

    这样做法当然不行,既然双方都可以修改,那系统的开销肯定会比较大。就好比管道一样。

    说了这么多,接下来让我们一起来看一下例子 IEasyService.aidl

    package xj.musicserver.easy;
    
    // Declare any non-default types here with import statements
    
    interface IEasyService {
        /**
         * Demonstrates some basic types that you can use as parameters
         * and return values in AIDL.
         */
        void connect(String mes);
        void disConnect(String mes);
    }
    

    这个 aidl 文件很接口,只有两个方法,connect 和 disConnect 方法。

    相关文章

      网友评论

        本文标题:Android AIDL 教程 (一)—— 简单的示例

        本文链接:https://www.haomeiwen.com/subject/outqmxtx.html