background image

Android

中 用 来 做 数 据 序 列 化 的 类 是

Parcel , 参 见 :

/reference/android/os/Parcel.html,封装了序列化的细节,向外提供了足够对象化的访

问 接 口,

Android 号称实现非常高效。

还有就是 AIDL (Android Interface Definition 

Language) 

,一种接口定义的语言,服务的 RPC 接口,可以用 AIDL 来描述,这样,ADT

就可以帮助你自动生成一整套的代理模式需要用到的类,都是想起来很乏力写起来很苦力的
那种。更多内容,可以再看看:guide/developing/tools/aidl.html,如果有兴致,可以找
些其他 PRC 实现的资料 lou 几眼。

关 于 Service 的 实 现 , 还 强 推 参 看 API  Demos 这 个 Sample 里 面 的

RemoteService

实现。它完整的展示了实现一个 Service 需要做的事情:那就是定义好需

要接受的

Intent,提供同步或异步的接口,在上层绑定了它后,通过这些接口(很多时候都

RPC 的...)进行通信。在 RPC 接口中使用的数据、回调接口对象,如果不是标准的系统实

现(系统可序列化的),则需要自定义

aidl,所有一切,在这个 Sample 里都有表达,强荐

Service 从实现角度看,最特别的就是这些 RPC 的实现了,其他内容,都会接近于 Activity

的一些实现,也许不再会详述了。

Broadcast Receiver

在实际应用中,我们常需要等,等待系统抑或其他应用发出一道指令,为自己的应

用擦亮明灯指明方向。而这种等待,在很多的平台上,都会需要付出不小的代价。比如,在

Symbian 中,你要等待一个来电消息,显示归属地之类的,必须让自己的应用忍辱负重偷

偷摸摸的开机启动,消隐图标隐藏任务项,潜伏在后台,监控着相关事件,等待转瞬即逝的

出手机会。这是一件很发指的事情,不但白白耗费了系统资源,还留了个流氓软件的骂名,

这真是卖力不讨好的正面典型。

在 Android 中,充分考虑了广泛的这类需求,于是就有了 Broadcast Receiver 这

样的一个组件。每个 Broadcast Receiver 都可以接收一种或若干种 Intent 作为触发事件
(有不知道 Intent 的么,后面会知道了...),当发生这样事件的时候,系统会负责唤醒或传
递消息到该 Broadcast Receiver,任其处置。在此之前和这以后,Broadcast Receiver
是否在运行都变得不重要了,及其绿色环保。这个实现机制,显然是基于一种注册方式的,
Broadcast Receiver 将其特征描述并注册在系统中,根据注册时机,可以分为两类,被我

冠名为冷热插拔。

所谓冷插拔,就是 Broadcast Receiver 的相关信息写在配置文件中(求

配置文件详情?稍安,后续奉上...),系统会负责在相关事件发生的时候及时通知到该
Broadcast Receiver

,这种模式适合于这样的场景。某事件方式 -> 通知 Broadcast -> 

启动相关处理应用。比如,监听来电、邮件、短信之类的,都隶属于这种模式。而热插拔,顾
名思义,插拔这样的事情,都是由应用自己来处理的,通常是在

 OnResume 事件中通过

registerReceiver 进行注册,在 OnPause 等事件中反注册,通过这种方式使其能够在运行

期间保持对相关事件的关注。比如,一款优秀的词典软件(比如,有道词典

...),可能会有在

运行期间关注网络状况变化的需求,使其可以在有廉价网络的时候优先使用网络查询词汇,