在进程之间共享活动对象的正确方法是什么?

时间:2015-09-12 22:55:28

标签: android ipc aidl android-binder

我正在研究在两个进程之间共享活动对象,但是关于它的文档通常是乏味的,有时even incorrect.

具体来说,我正在研究通过包裹共享Binder对象。文件陈述。

  

活动对象

     

Parcel的一个不寻常的功能是能够读取和写入活动对象。对于这些对象,不写入对象的实际内容,而是写入引用该对象的特殊标记。从Parcel中读取对象时,您不会获得该对象的新实例,而是获取与最初编写的完全相同的对象进行操作的句柄。有两种形式的活动对象可用。

     

Binder对象是Android的通用跨进程通信系统的核心工具。 IBinder接口描述了一个带有Binder对象的抽象协议。任何此类接口都可以写入Parcel,并且在读取时您将收到实现该接口的原始对象或将回调传递回原始对象的特殊代理实现。使用的方法是writeStrongBinder(IBinder),writeStrongInterface(IInterface),readStrongBinder(),writeBinderArray(IBinder []),readBinderArray(IBinder []),createBinderArray(),writeBinderList(List),readBinderList(List),createBinderArrayList()

但是,当收到parcel时,返回的对象只是一个BinderProxy,它不能转换为原始类或实现除基本IBinder调用之外的任何调用。虽然这显然是文档中提到的代理对象,但我想知道该方法用于引用同一语句中提到的原始对象。

我还想知道是否有一个来源,这个主题得到了更彻底的解释或记录。

1 个答案:

答案 0 :(得分:-2)

您应该能够将对象强制转换为原始类,因为它正确地实现了Parcelable接口。像这样投射它:

// in ProcessDataActivity retrieve User 
Intent intent = getIntent();
ParcelableObjectExample usr = (ParcelableObjectExample)
     intent.getParcelableExtra("parcelableExample");

要使此成功,您需要在ParcelableObjectExample上正确实现Parcelable接口,为此您必须:

  1. 实施其describeContents方法
  2. 实现其抽象方法writeToParcel,它接受对象的当前状态并将其写入Parcel
  3. 向我们的类添加一个名为CREATOR的静态字段,该类是实现Parcelable.Creator接口的对象
  4. 添加一个以Parcel作为参数的构造函数。 CREATOR调用该构造函数来重建我们的对象。