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

Posted

技术标签:

【中文标题】在进程之间共享活动对象的正确方法是啥?【英文标题】:What is the correct way to share Active Objects between processes?在进程之间共享活动对象的正确方法是什么? 【发布时间】:2015-09-12 22:55:28 【问题描述】:

我正在研究在两个进程之间共享活动对象,但是有关它的文档通常乏善可陈,有时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() .

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

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

【问题讨论】:

【参考方案1】:

您应该能够将对象转换为其原始类,前提是它正确实现了 Parcelable 接口。投射是这样的:

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

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

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

【讨论】:

不幸的是,以这种方式使用 parcelable 会编组该类,然后在检索到该类时将其解组,这意味着该对象只是在新进程中重新创建,而不是一个活动对象。

以上是关于在进程之间共享活动对象的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在进程之间发送大量数据的最佳方法是啥?

android中的跨进程是啥意思

在进程之间共享一个复杂的对象?

多进程在进程之间共享不可序列化的对象

如何在 .exe 和 .dll 之间正确共享对象?

在主管树中终止子进程的正确方法是啥