为了克服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中③处所示,代码如下:

    android:name=".AidlService"

    android:exported="true">

   

       

   

     这里有几点需要注意:

    (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,来理解一下这个流程。

更多相关文章

  1. android:weight属性的使用——android开发之xml布局文件
  2. Android(安卓)invalidate与postInvalidate用法
  3. Android(安卓)学习手札(一) 应用程序架构
  4. android 4.4 下载文件
  5. Andriod 实现可拖动列表
  6. android之listview使用方法(一)
  7. android 内存优化 性能优化
  8. Translation002—Package Index(Android包索引)
  9. Android(安卓)模拟器入门

随机推荐

  1. Android免费课程分享
  2. Android:TextView文字跑马灯的效果实现
  3. (转)为什么Android不是GPL许可证?
  4. android 抽屉式滑动demo
  5. android button多状态, selector
  6. 修改ScrollView滚动条样式
  7. Android Studio Toast/Notification中文
  8. Android Overview
  9. Android的Adapter与BaseAdapter的介绍
  10. Android 控件属性