AIDL和Parcelable

简介

AIDL(Android Interface Definition Language)使客户端和服务端通过它定义的编程接口来达成共识,以便进行进程间通信(IPC)。

仅当允许其它应用程序通过IPC方式访问Service,并且Service需要多线程运行时,才应该使用AIDL。

  • 如果从本地进程发起调用,则调用将在调用线程中运行。如果想要本地调用依然在另一个进程中运行,可以在清单文件的Service中声明android:process=":remote"。
  • 如果从远程进程发起调用,则会在Service的进程运行。
  • 关键字oneway会改变远程调用的处理方式(该关键字只能作用于某一个接口)。远程调用不会阻塞,但本地调用仍然是同步执行的。

使用

1. 创建.aidl文件

2. 服务端实现接口并向客户端公布

3. 客户端获取接口实例

4. 服务端调用客户端

5. Parcelable


<a href="#创建.aidl文件">1. 创建.aidl文件</a>

在.aidl文件中,声明一个带有若干方法的接口。且只能定义一个接口,且只能包含接口的定义和方法声明。

声明的方法可带有参数和返回值,它们的类型可以为下面允许的类型

所有非基本类型的参数都需要带有一个指明数据方向的标志。
可以是in、out、inout。
简单类型的参数默认是in,且不能是其他方向的值。

<a href="#允许的类型">允许的类型</a>

  • Java语言的所有基本类型,void,null
  • CharSequence
  • String
  • List,类型实参必须是这里列出的类型。实际使用的类是ArrayList
  • Map,类型实参必须是这里列出的类型。实际使用的类是HashMap
  • 基于AIDL生成的接口
  • 已声明的Parcelable类型

最后把.aidl文件放到src/目录下,在编译时,SDK工具会在gen/目录下生成IBinder接口文件。


<a href="#服务端实现接口并向客户端公布">2. 服务端实现接口并向客户端公布</a>

.aidl文件被自动生成.java接口文件。它包含一个静态子类Stub,该子类扩展了Binder类,且实现父接口。

所以,我们应该扩展Stub,并实现由.aidl文件继承的方法。

在实现AIDL接口时的注意事项

  • 此接口的实现必须要保证多线程运行的安全
  • 默认情况下,客户端调用该接口是以同步方式运行的。所以该服务的响应时间较长,则不应该在主线程中调用,而是在客户端的单独线程中调用。
  • 所有异常都不会发还给调用者

向客户端公布接口

在onBind方法中返回该接口的实例。


<a href="#客户端获取接口实例">3. 客户端获取接口实例</a>

为了让客户端有权限访问接口类,客户端必须在src/目录下拥有一份.aidl文件的拷贝,用于生成供客户端访问AIDL方法的Binder接口。

在接收到回调方法onServiceConnected中的IBinder时,客户端必须调用YourServiceInterface.Stub.asInterface(service)来把返回的参数转换为YourServiceInterface类型。

之后就可以使用该接口和服务端通信了。

在调用服务器的方法时,必须要catch DeadObjectException异常,当连接中断时会抛出该异常,这是远程方法唯一抛出的异常。


<a href=#服务端调用客户端>4. 服务端调用客户端</a>

通过之前的步骤,客户端已经可以调用服务端的方法了。如果服务端也想回调客户端,需要更多的步骤。

  1. 除了之前建立的.aidl文件,还需要额外简历一个.aidl文件,该文件表示客户端提供给服务端调用的接口。
  2. 之前的.aidl文件中需要增加两个方法,注册和解注册。参数为第二个.aidl文件的接口。
  3. 在服务端实现第一个接口。
    1. 实例化一个RemoteCallbackList,它是用来存储客户端接口的列表。
    2. 实现注册和解注册方法,一般为,判断参数是否为null,不为null,则调用RemoteCallbackList的方法注册/解注册。
  4. 在客户端实现第二个接口。

<a href="#Parcelable">5. Parcelable</a>

如果想要在AIDL中使用某个类作为参数或返回值,那么该类必须实现Parcelable接口,并且使用parcelable package.class;来声明。

<a href="#实现Parcelable接口">实现Parcelable接口</a>

  1. 实现describeContents方法,默认返回0就可以。
  2. 实现writeToParcel(Parcel dest, int flags)方法。该方法用于序列化,即把类中的数据写入外部的Parcel中保存。
  3. 实现静态的Parcelable.Creator接口:
    1. createFormParcel(Parcel in)用于反序列化,该方法从Parcel中读取数据以创建对象。
    2. newArray(int size)用于创建该类的一个数组,使用return new T[size]即可。

Parcelable和Serializable的区别

Parcelable直接在内存中读写,而Serializable读写到硬盘上。
因此,Parcelable速度也更快。而Serializable使用了反射,速度更慢。
但是因为Parcelable只在内存中读写,所以,它并不能通过网络传递,只能跨进程使用。而Serializable都可以。


参考

Service调用Client

Android AIDL中文官方文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容