zoukankan      html  css  js  c++  java
  • AIDL使用详解

    一、对AIDL进行说明

          AIDL允许定义一个编程的接口来作为客户端和服务端通信的桥梁,AIDL定义了客户端和服务端的编程标准,在Android里边一个进程无法直接访问另一个进程的内存信息,但是要访问的话,我们就需要把他们的设备分解成操作系统能认识的基本数据类型。使用AIDL必须要跨进程,所以通讯起来非常耗内存和系统资源,因此,没有必要处处用AIDL,那么什么时候用AIDL呢,通过IPC机制不同的程序访问你的服务,并且服务要处理多线程的时候才有必要使用AIDL,如果你只是想通过IPC机制要不同的程序访问你的服务的时候,实现Binder就可以了;如果只想通过IPC机制,但是不想控制多线程,实现Messanger就可以了,Binder和Messanger都是在单线程中完成的。

    二、实现AIDL步骤(AIDL里只可以定义方法,不可以定义属性)

          按照下边的步骤,细心地做下去,一定能学会AIDL的基本用法的

    1、创建.aidl文件

         下边是在eclipse里创建一个.aidl文件,创建完这个文件,就会在gen目录下自动生成一个相对应的.java文件,如图:

              

              

           下边是在Android Studio里创建一个.aidl文件,为了让大家和下边的内容衔接起来,这个aidl文件要命名为IImoocAidl.aidl,里边的方法为 int add(num1,num2)。

              

              

              

              

           

           但是使用AS不会自动编译,必须编译一下,才会生成.AIDL文件

           编译前后的情况如下图:

              

              

         2、写一个Service,在Servic里实现.aidl里的IImoocAidl接口,如下图:

               

         3、共享一个接口给客户端,因为privite  IBinder  iBinder,所以不能直接访问iBinder,这个时候就要通过public  IBinder onBinder(Intent intent)这个方法,因为当客户端绑定在服务的时候就会调用这个方法。只需修改一下这个方法的返回值即可

              

         以上是服务端的内容,下面是客户端的操作

         客户端:新建一个项目,客户端简单的搭建一个界面:

              

         1、在客户端需要创建一个和服务端一模一样的.aidl文件

              

         2、绑定服务,绑定服务要写在onCreate方法里,当客户端启动的时候就绑定服务

              

         3、2中缺一个conn,在这里要生成一个conn

              privata  IlmcoocAidl  iImcoocAidl;

              

         4、在相应的位置调用远程服务的方法,我这个里边是计算两个数的和

              iImoocAidl.add(num1,num2);

         5、解除绑定

              

    三、AIDL支持的数据类型

         1、基本数据类型(short不行)

         2、string、CharSequence

         3、List、Map

         4、Parcelable

         除了基本数据类型,其他类型的前面要加上in/out/inout来表示这个参数是输入、输出或者输入输出都能用的。

              

    四、下边是支持Parcelable类型的一个例子

          public class Person implements Parcelable{

             private String name;

             private int age;

             public Person(String name, int age) {

                super();

                this.name = name;

                this.age = age;

            }

           public String getName() {

             return name;

           }

          public void setName(String name) {

              this.name = name;

          }

          public int getAge() {

              return age;

          }

          public void setAge(int age) {

               this.age = age;

           }

         @Override

         public int describeContents() {

             return 0;

          }

         @Override

          public void writeToParcel(Parcel dest, int flags) {

              dest.writeString(name);

              dest.writeInt(age);

          }

          public Person(Parcel source) {

              this.name=source.readString();

              this.age=source.readInt();

           }

           public static final Creator<Person> CREATOR=new Creator<Person>() {

                @Override

                public Person[] newArray(int size) {

                     return new Person[size];

                 } 

           @Override

           public Person createFromParcel(Parcel source) {

                return new Person(source);

            }

          };

    }  

         需要创建两个.aidl文件,Person.aidl和IImoocAidl.aidl

              

             

          创建一个IRmoteService 

              private  ArrayList<Person> persons;

              

          以上是服务端的操作,下班是客户端的操作

         1、拷贝服务端的两个aidl文件

         2、绑定服务

         3、生成一个conn

         4、在相应的位置调用远程服务的方法

             

          5、解除绑定

         

           

          

  • 相关阅读:
    ASCII、Unicode和UTF-8等常见字符编码格式介绍
    pycharm创建脚本头文件模板
    pycharm常用设置项和快捷键
    Genymotion安装apk问题
    [Android测试] Appium的一些坑问题错误解决 与 技巧集锦
    Appium+python自动化测试过程中问题
    python客户端和Appium服务端联调出现的问题解决办法
    移动端自动化测试环境搭建
    "http://127.0.0.1:4723/wd/hub"的解释
    wireshark抓包看ECN
  • 原文地址:https://www.cnblogs.com/chentong/p/5394576.html
Copyright © 2011-2022 走看看