2

我正在研究在两个进程之间共享活动对象,但是有关它的文档通常乏善可陈,有时甚至不正确。

具体来说,我正在研究通过包裹共享 Binder 对象。文档指出。

活动对象

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

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

但是在收到包裹时,返回的对象只是一个BinderProxy,不能转换为原始类,也不能实现任何超出基本IBinder调用的调用。虽然这显然是文档中提到的代理对象,但我想知道引用同一语句中提到的原始对象的方法是什么。

我还想知道是否有来源可以更彻底地解释或记录该主题。

4

1 回答 1

-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 调用该构造函数来重建我们的对象。
于 2015-09-14T14:32:22.923 回答