在 Intent 中传递对象引用,而不实现可序列化或可 Parcelable

我知道类似的问题已经被问过很多次了。我想我读了大部分。但没有一个答案是适用的。

我需要通过 Intents(活动调用/广播)传递复杂的对象。一切都在我的过程中完成。这就是为什么我认为没有理由将我的对象写入Streams,只是为了在几毫秒后重新组装它们。我想通过我的应用程序传递我的对象引用。有没有办法做到这一点。

由于我的应用程序将连续多次广播同一事件,因此我不能依赖静态成员。我需要为我广播的内容获得完全相同的对象。

这就是为什么我正在考虑一个静态的“引用持有者”,它将接受一个对象并返回一个整数,该整数在其内部列表中标识此对象,以便我可以通过.putExtras传递此整数。但是据我所知Java,我无法在添加后从此列表中清理此对象,因为多个侦听器可以插播在同一个对象中,并且我必须永远将其保留在我的参考持有者中(假设线程可能随时恢复 - 甚至2分钟后)。

有什么想法吗?我做错了什么吗?或者任何关于如何清理我的引用的想法(可能在几秒钟之后?这可能会导致崩溃,但它似乎比编写无缘无故组装和重新组装我的对象的代码更适用)


答案 1

您的选项非常清楚:无法在 Intent 中传递不可编组的对象(可 Parcelable、Serializable)。句点。

您可能能够做的是传递对不可编组对象的引用的内容。这个想法是,您将按照将密钥传递给映射的顺序执行一些操作,该映射将该键映射到您有兴趣传递的值。如果 Intent 发送方和 Intent 接收方都有权访问映射,则可以传达对不可编组对象的引用。

我不明白,确切地说,为什么你认为静态成员不是你想要的。我猜想,自定义应用程序对象中的静态映射几乎正是您想要的。...我怀疑,从你对WeakHashMaps的评论中,你已经发现了这一点。

...除了到目前为止,您所说的任何内容都无法解释为什么您要使地图变弱。在使用弱映射之前,请查看软引用,以确保这不是您的意思。

祝你好运


答案 2

编辑:

忘记这个解决方案。它不起作用。Android 正在应对您在 .startActivity() 中传递的意图。无法在活动中获取任何引用。在我看来,这是谷歌的很棒的bu****t。您必须调用您的活动并将对象的引用放在静态成员中...

正如G. Blake Meike所说,没有办法通过 Intents 在 Android 中传递 Object 引用。但是你也许可以使用弱引用

关于这个主题的一个非常优秀的例子可以在这里找到:http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

我通过这个问题得到了这个解决方案:是否可以获得对象引用计数?

因此,我基本上要做的是:我将使用 Intents 作为 WeakHashMap 的键,并将我的 Object 作为值传递。这似乎是唯一适合作为键的对象,因为您放入 Intents 附加内容的所有内容都将被序列化。因此,每个 Intent 只能传递一个对象。您可以在 Acitivity 中实现子类,这些子类可以保存对象,而是将此子类放入映射中。但我仍然不确定接收方将获得的 Intent 对象是否与调用方创建的相同,但我认为是这样。如果不是,我将编辑此解决方案(或者也许有人可以清除它)。