Android Binder Analysis(4)

Android Binder Analysis(4)

@(数据库系统)[Binder, AIDL, Messenger]

上篇博文中我们以AIDL为核心,简单介绍了AIDL同步类型项目的基本开发流程,并总结了AIDL开发中的M3T,即:

  • MUST:Package Name Of JAVA Bean MUST Be Same To AIDL
  • MUST:AIDL File Of Client MUST Be Same To Server
  • MUST:Non Primitive type MUST implement Parcelable Interface
  • TAG:Directional TAG For Non-primitive Parameters

接下来我们紧接上篇博文的话题,来介绍M3T中的T(定向TAG).

或许细心的朋友已经发现了,在上篇的demo中,我们编写的BookManager.aidl文件中有如下接口:
这里写图片描述

Book前面有一个in,就像数据类型一样的标记,那么这个东东是干什么的呢?这里的in被叫做定向标记,对于非基本类型的数据我们必须使用in指定其数据流向,一共有三种标记可以使用:in,out,inout
那么什么叫数据流向呢?数据流向指的是什么?可不可以当作输入流和输出流来理解?
我们写一个demo来测试一下:
首先修改BookManager.aidl如下:
这里写图片描述
随后在服务端(BookManagerService.java)中添加实现函数:
这里写图片描述
客户端调用该函数:
这里写图片描述
随后重新启动客户端和服务器,执行结果如下:
这里写图片描述
这里写图片描述
这里写图片描述
通过上述执行结果我们可以看到out标记修饰的Book并没有将属性值传递到服务器,反而客户端和服务器的属性值均被修改为null.因此,我们不妨大胆猜想,这里的In Out标记并不是指的单纯流向,而应该指的是数据的相对流向:
  in表示数据流是从客户端传入对象流向服务器的
  out表示数据流是从服务器流入客户端传入对象的
  inout指的是针对传入对象双向传递
我们再次修改服务器代码以验证上述猜想:
这里写图片描述
执行后的结果如下:
这里写图片描述
上述运行结果充分验证我们的猜想是完全正确的,对于out TAG型的变量而已,其不会传递客户端任何属性值到服务器,其属性值完全受服务器操作影响,服务器修改其值,客户端同时发生改变
在AIDL开发中,所有的非基本参数都需要一个定向TAG来指出数据流
通的方式,基本参数的定向TAG默认是并且只能是 in,其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。其中,数据流向是针对在客户端中传入的对象而言的。in 为定向 TAG的话表现为服务端将会接收到一个那个对象的完整数据,但是客户端的那个对象不会因为服务端对传参的修改而发生变动;out 的话表现为服务端将会接收到那个对象的参数为空的对象,但是在服务端对接收到的空对象有任何修改之后客户端将会同步变动;inout 为定向 TAG的情况下,服务端将会接收到客户端传来对象的完整信息,并且客户端将会同步服务端对该对象的任何变动.

至此我们就完成了AIDL同步方式demo的学习,接下来我们将会介绍AIDL异步回调行为的实现,敬请期待。

最新文章更新在微信公众号上,欢迎关注获取详情:
这里写图片描述


感谢阅读这份博文。转载请注明出处:小海窝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章