一、概述   

AIDL意思即Android  Interface Definition Language,翻过来就是Android接口定义语言,是用于定义服务端和客户端通信接口的一种描述语言,可以拿来生产IPC代码,从某种意义上说AIDL其实就是一个模板,因为在使用过程中,实际起作用的并不是AIDL文件,而是据此生产的一个Interface的实例代码,AIDL其实是为了避免我们重复写代码而出现的一个模板。
设计AIDL这门语言的目的就是为了实现进程间通信。在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。
二、语法
  AIDL语言十分简单,与java语言基本一致
  
   1、AIDL语言以.aidl为后缀名。
   2、AIDL支持的数据类型分为以下几种:
   (1)、八种基本数据类型:byte,char,short、int、long、float、double、boolean、String,CharSequence。
   (2)、实现了Parcelable接口的数据类型。
   (3)、List 类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象。
   (4)、Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象。

三、AIDL分类(两类)

1、第一类:声明实现了Parcelable接口的数据类型,以供其他AILD文件使用那些非默认支持的数据类型。

2、第二类:用来定义接口方法,声明要暴露那些接口给客户端调用,定向Tag就是用来标注这些方法的参数值。

四、定向TAG

定向Tag表示在跨进程通信中数据的流向,用于标注方法的参数。分为in,out,inout。in表示由客户端设置,out表示由服务端设置,inout是两者均可设置。此外,如果AIDL方法接口的参数值类型是:基本数据类型、String、CharSequence或者其他AIDL文件定义的方法接口,那么这些参数值的定向 Tag 默认是且只能是 in,所以除了这些类型外,其他参数值都需要明确标注使用哪种定向Tag。

五、明确导包

在AIDL文件中需要明确标明引用到的数据类型所在包名,即使两个文件处在同个包名下。

六、注

客户端的AIDL文件包名需要与服务端的AIDL文件包名一致,否则会报  java.lang.SecurityException:Binder invocation to an incoverect interface。

七、基本使用方法

1.定义AIDL文件,此文件相当于一个协议,定义服务端要实现的方法。
     如:
           package com.example.aidl;  
           interface IMyService {  
                  void play();  
                 void pause();  
           }

2.实现服务端Service:
    如:
    public class AIDLService extends Service {  
         private MyBinder mBinder;  
    @Override  
    public IBinder onBind(Intent intent) { 
          mBinder = new MyBinder();
        return mBinder;  //返回binder对象
    }  
     /*  
    * 该类继承了IMyService.Stub类而不是extends Binder类。 
     * IMyService.Stub是Binder的子类。 
     * 进程内的Service定义MyBinder内部类是继承Binder类。 
     */  
    public class MyBinder extends IMyService.Stub {  
        @Override  
        public void play() throws RemoteException {  
           Log.i(tag, "service 自定义 play()...");   
        }  
        @Override  
        public void pause() throws RemoteException {  
             Log.i(tag, "service 自定义 pause()..."); 
        }  
    }

3.把AIDL文件接口复制到Client项目
4.在Client项目中调用Service项目的服务。
如:
public class MainActivity extends Activity implements OnClickListener {  Button btnBind, btnPlay, btnPause;  IMyService mBinder; // 接口的一个引用  boolean mIsBind = false; // 绑定值为true,未绑定制为false;
private ServiceConnection mConn = new ServiceConnection() {  @Override  public void onServiceDisconnected(ComponentName name) {  }  @Override  public void onServiceConnected(ComponentName name, IBinder service) {  /* * 获得另一个进程中的Service传递过来的IBinder对象-service, * 用IMyService.Stub.asInterface方法转换该对象,这点与进程内的通信不同 */  mBinder = IMyService.Stub.asInterface(service);  mIsBind = true;  Log.i("MainActivity", "onServiceConnected....");  }  };   @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_main);  btnBind = (Button) findViewById(R.id.btn_bind);  btnPlay = (Button) findViewById(R.id.btn_play);  btnPause = (Button) findViewById(R.id.btn_pause);  btnBind.setOnClickListener(this);  btnPlay.setOnClickListener(this);  btnPause.setOnClickListener(this);  }
@Override
public void onClick(View v) {  Intent intent = new Intent();  int btn = v.getId();  switch (btn) {  case R.id.btn_bind:  intent.setAction(Constant.ACTION_AIDL);  bindService(intent, mConn, BIND_AUTO_CREATE);//绑定服务break;  case R.id.btn_play:  if (mIsBind){  try {  mBinder.play(); //调用IMyService接口的方法,服务端的逻辑就可以使用} catch (RemoteException e) {  e.printStackTrace();  }//调用service中的play()  }  break;  case R.id.btn_pause:  if(mIsBind){  try {  mBinder.pause(); //调用IMyService接口的方法} catch (Exception e) {  e.printStackTrace();  }  }  break;  }  }
}  
以上可以看到,Stub是IMyService中的一个静态抽象类,继承了Binder,并且实现了IMyService接口。这也就解释了我们定义IMyInterface.Stub的时候为什么需要实现IMyService中的方法了,也说明了为什么我们可以把IMyService.Stub向上转型成IBinder了。

总结: 
        AIDL的最终效果就是让 IPC的通讯就像调用函数那样简单。自动的帮你完成了参数序列化发送以及解析返回数据的那一系列麻烦。而你所需要做的就是写上一个接口文件,然后利用aidl工具转化一下得到另一个java文件,这个文件在服务和客户端程序各放一份。服务程序继承IxxxxService.Stub 然后将函数接口里面的逻辑代码实现一下。

Android AIDL(接口定义语言)简单理解和基本使用方法相关推荐

  1. android keyevent.java,dispatchKeyEvent简单理解

    当在launcher的allapps界面按下按键1(当前设备为带键盘的Android设备)的时候,PhoneWindowManager.java到Launcher.java的处理log如下. 2021 ...

  2. Android文字跑马灯简单实现的三种方法

    第一种 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= ...

  3. 简单理解判断类型的方法(四种)

    判断类型有四种方法(不全但是相对来说挺全了,而且也够用了) 1.typeof 2.instanceof 3.constructor 4Object.prototypy.tostring.call() ...

  4. Android:安卓学习笔记之共享元素的简单理解和使用

    Android 共享元素的简单理解和使用 1 .基本概念 2.基本使用 1.Activity to Activity跳转实现 1.1.使用步骤 1.2.案例说明 2.Fragment to Fragm ...

  5. Android:安卓学习笔记之MVP模式的简单理解和使用

    Android MVP模式的简单理解和使用 MVP模式 1. 为什么使用MVP模式? 1.1.实例说明 2.一步步让你理解MVP 2.1.MVP实现第一步, 将页面拆分为M/V/P三个模块 2.2. ...

  6. (转载)你真的理解Android AIDL中的in,out,inout么?

    前言 这其实是一个很小的知识点,大部分人在使用AIDL的过程中也基本没有因为这个出现过错误,正因为它小,所以在大部分的网上关于AIDL的文章中,它都被忽视了--或者并没有,但所占篇幅甚小,且基本上都是 ...

  7. Android HIDL HAL 接口定义语言详解

    1. HIDL 概述 在 Andoird 8.0 版本框架代码中,加入了 HIDL(HAL 接口定义语言),HIDL 的出现是为了将用户层和 HAL 层分割开,它指定了 HAL 和用户之间的接口,让用 ...

  8. android 点击事件消费,Android View事件分发和消费源码简单理解

    Android View事件分发和消费源码简单理解 前言: 开发过程中觉得View事件这块是特别烧脑的,看了好久,才自认为看明白.中间上网查了下singwhatiwanna粉丝的读书笔记,有种茅塞顿开 ...

  9. Android:安卓学习笔记之navigation的简单理解和使用

    Android navigation的简单理解和使用 1 .基本概念 1.1.背景 1.2.含义 2.组成 2.1.Navigation graph 2.2.NavHostFragment 2.3.N ...

最新文章

  1. java字符串去掉空格
  2. 离职员工如何处理Exchange邮箱
  3. 有开电商的集合了,了解Water Pamola通过恶意订单对电商发起攻击
  4. python pymysql实例_python-Mysql的操作(pyMysql的介绍)
  5. [Luogu] P1939 【模板】矩阵加速(数列)
  6. java项目定时任务_java项目定时任务实现
  7. 电平通讯速度_飞凌干货丨几种常见的电平转换电路分析及应用
  8. GM620光猫telnet获取pppoe密码
  9. Mugeda(木疙瘩)H5案例课—什么,才是福-岑远科-专题视频课程
  10. 卷积神经网络案例:中文字体识别——隶书和行楷
  11. 左手读红楼梦,右手写 BUG,闲快活
  12. win10安装Microsoft Office 2016(64位)提示已安装Microsoft Office 2016(32位)
  13. android 高德地图移动卡顿_使用高德SDK开发安卓地图应用软件
  14. Virustotal的使用
  15. SQL复杂查询,优化
  16. 美国最佳本科计算机科学,美国本科计算机科学专业排名
  17. [linux][运维]DELL服务器raid命令行工具MegaCli常用命令
  18. 尼科彻斯定理(简单易懂)
  19. 超低功耗 段码LCD液晶显示驱动IC-VKL060 SSOP24 15SEG*4COM,超低工作电流约7.5微安,多用于传感器/水电表/工控仪表等
  20. html 编辑器发帖,帖子编辑器:轻轻松松发帖

热门文章

  1. IOS 字符串转日期
  2. Linux系列之查看CentOS版本
  3. 面部美容穴位--祛除痘痘/色斑/肌肤干燥
  4. InfluxDB基础操作
  5. 蓝皮书:政用大数据带动商用民用大数据发展前景可期
  6. idea修改jsp、html需要重启服务器
  7. 使用bert4keras加载预训练模型
  8. netty实现网络推送
  9. 【转载】提高Ubuntu虚拟机运行速度
  10. java 数组的创建 与 赋值