美文网首页Android&KotlinAIDL
哥哥手把手教你认识AIDL的详细使用,来了老弟

哥哥手把手教你认识AIDL的详细使用,来了老弟

作者: 哥哥是欧巴Vitory | 来源:发表于2020-01-16 15:52 被阅读0次

    为了克服Linux中IPC各种方式的缺点,在Android中引入了Binder机制。但是当说起Binder在Android中的使用时,几乎所有的资料都是在说AIDL的使用。AIDL的全称是Android Interface Definition Language,即Android接口定义语言,是Binder机制实现Android IPC时使用比较广泛的工具。

    下图展示了该Demo的结构图和AIDL关键文件:

      1、建立两个App,分别为Client端和Server端。

          这个比较 好理解,Server端就是包含了Service真正干活的那一端;Client端就是通过远程操控指挥的那一端,分别在不同的App中。如下图所示:

      2、在Server端main目录下建立aidl文件夹以及.aidl文件,并copy一份到Client端,如图6.1中②处所示结构。注意,Client端和Server端②处是一模一样的。另外,AS中提供了快捷方式创建aidl文件,在main处点击右键 > New > AIDL > AIDL File文件,按照提示给aidl文件命名即可自动创建完成,可以看到文件路径也是该项目的包名。

      这里给aidl命名为IDemoService.aidl,这里需要注意的是命名规范,一般都是以“I”开头,表示是一个接口,其内容如下:

    //========== IDemoService.aidl========

    package com.songwei.aidldemoserver;

    // Declare any non-default types here with import statements

    interface IDemoService {

        void setName(String name);

        String getName();

    }

      3、Server端创建Service文件 AidlService.java,如图6.1中③处所示,代码如下:

    <service

        android:name=".AidlService"

        android:exported="true">

        <intent-filter>

            <action android:name="com.songwei.aidl" />

        </intent-filter>

    </service>

         这里有几点需要注意:

        (1)exported属性值,如果有“intent-filter”,则默认值为true,否则为false。所以这里其实可以去掉,因为有“intent-filter”,其默认值就是true。

        (2)由于笔者在后面启动该service的时候用的action的方式,所以这里就有了“intent-filter”里面的action。如果用其他方式启动,这个service的注册信息就需要相应的改动了,有一定开发经验的读者应该都知道,就不展开讲了,主要是怕读者容易忽略这里,所以特别提醒一下。

      4、编译Sever端和Client端App,生成IDemoService.java文件。

           当编译的时候,AS会自动为我们生成IDemoService.java文件,如图6.1和图6.2中④处所示。当你打开该文件的时候,是不是看到了如下场景?

    AIDL是Android接口定义语言,IDemoService.java是一个java中的interface(接口),现在是不是若有所思了呢?AIDL正是定义了IDemoService.java这个接口!!! 这个接口文件就是AIDL帮助咱们生成的Binder相关代码,这些代码就是用来帮助实现Client端和Server端通信的。前面第2步中提到的IDemoService.aidl文件,其作用就是作为原料通过AIDL来生成这些你貌似看不懂的代码的,第3步中的AidlService.java和后续在Client端App连接Server端App的时候,其实这个aidl文件就从来没有出现过,也就是说,它已经没有什么价值了。所以说,AIDL的作用就是用来自动生成Binder相关接口代码的,而不需要开发者手动编写。

           打开IDemoService.java文件后,点击主菜单兰Code > Reformat Code (或 Ctrl + Alt +L快捷健),会看到如下形式的接口文件: 后面在讲完Client端和Server端的连接及通信后,还会继续深入剖析这个文件。

      5、Client端ClientActivity连接Server端AidlService并通信

           ClientActivity.java的内容如下,布局文件在此省略,比较简单,就两个按钮,一个用于绑定,一个用于解绑,看Button命名也很容易分辨。

      6、运行

           运行的时候,需要先启动Service端进程,才能在Client端中点击“绑定”的时候绑定成功。完成一次“绑定”和“解绑”,得到的log如下所示:

    可以结合前面的ClientActivity.java和AidlService.java代码中的添加的log,来理解一下这个流程。

    相关文章

      网友评论

        本文标题:哥哥手把手教你认识AIDL的详细使用,来了老弟

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