zoukankan      html  css  js  c++  java
  • Android Studio中如何创建AIDL

    实现客户端添加Book,Service接收并打印出书籍信息

    一、创建Book类

    1.创建文件夹(本文命名为aidl)

    2.创建Book类并继承Parcelable接口(原因:AIDL只能传送继承Parcelable接口的类)

    详见:第二章——Parcelable接口的使用(跨进程,Intent传输)

    二.创建AIDL文件夹与Book.aidl

    用AIDL File填写名字的时候先随便填写(因为如果直接填Book为名字时候会报错,只有先创建完之后再RENAME才不会报错)

    之后变成

    为什么要有Book.aidl类,因为只有将类在aidl中声明时候,AIDL才能调用Book类,接下来为如何声明

    所以说要让AIDL能够传送自定义类需要 ①继承Parcelable接口 ②创建同名.aidl文件声明自己。

    三、创建IBookManager.aidl(作用:设置让客户端允许调用的接口)

    四、分析Binder的运行原理

    注:Stub对象可以理解为Binder类

    1.系统会自动生成IBookManger.java文件在

    分析其属性和方法
    DESCRIPTOR:Binder的唯一表标识,"一般用类名表示"

    asInterface(IBinder obj):将服务端的Binder对象转成客户端的所需的AIDL对象。

    ①:若客户端与服务端在同一进程则返回服务端的Stub本身。

    ②:若客户端与服务端在不同进程则返回的是Stub.proxy对象。

    asBinder():返回当前的Binder对象

    onTransact():当客户端发起跨进程请求时,会调用此方法,返回Stub.proxy

    Proxy#getBookList():我们刚才创造的接口。

    运行原理:

    好了,运行原理和创建方式就到这里。

    五、AIDL支持的数据类型

    String、Char、基本数据类型、List、Map、Parcelable

    六、AIDL文件中 in类型out类型和inout数据的区别

    1.只有AIDL支持的数据类型不需要,其他类型的参数必须要加上参数。

    in:客户端的参数输入;

    解析:是把实参的值赋值给行参   那么对行参的修改,不会影响实参的值 

    out:服务端的参数输入;

    解析:传递以后,行参和实参都是同一个对象,只是他们名字不同而已,对行参的修改将影响实参的值

    inout:这个可以叫输入输出参数,客户端可输入、服务端也可输入。客户端输入了参数到服务端后,服务端也可对该参数进行修改等,最后在客户端上得到的是服务端输出的参数。

    分析in类型和out类型以及调用Proxy#getBookList()的运作流程

    假设getBookList()有in、out类型  如:getBookList(in Book book,out String[] str);

    当客户端远程调用此方法的时候

    ①:创建该方法需要的输入类型Parcel对象_data(这里为Book),输出类型(这里为str),和返回值对象(这里为List),写入data中

    ②:调用transact发起RPC(远程调用请求),挂起当前线程(客户端的)

    ③:调用服务端的onTransact(),直到RPC返回结果,从_reply中取出PRC返回结果

    ④:最后返回_reply的数据(个人认为这里就是将返回的_reply的值给客户端的str) 导致服务器端修改行参将影响实参的值

  • 相关阅读:
    Linux 内核开发—内核简单介绍
    strcmp函数和strcpy函数
    POJ 3734
    怎样使用SetTimer MFC 够具体
    java 递归函数
    海量数据存储
    使用WinINet和WinHTTP实现Http訪问
    getline函数
    UDP编程
    数据文件传输通道技术解决方式
  • 原文地址:https://www.cnblogs.com/rookiechen/p/5352053.html
Copyright © 2011-2022 走看看