在Intent中传递Object引用,而不实现Serializable或Parcelable

时间:2013-02-17 01:13:47

标签: java android android-intent android-activity reference

我知道有多次问过类似的问题。我想我读了大部分内容。但没有一个答案适用。

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

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

这就是为什么我在考虑一个静态的“Referenceholder”,它会接受一个Object并返回一个整数,在它的内部列表中标识这个对象,所以我可以通过.putExtras传递这个整数。但据我所知,Java在添加之后无法从此列表中清除此Object,因为多个Listener可以在同一个对象中进行interess,并且我必须将它保留在我的Referenceholder中(假设一个线程)可以在任何时间恢复 - 甚至2分钟后。)

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

2 个答案:

答案 0 :(得分:7)

您的选择非常明确:无法在Intent中传递非可编组对象(Parcelable,Serializable)。完全停止。

您可能能够做的是传递一些对非可编组对象的引用。我们的想法是,您可以按照将密钥传递给地图的顺序执行某些操作,该地图将该密钥映射到您有兴趣传递的值。如果Intent发件人和intent收件人都可以访问地图,则可以传递对不可编组对象的引用。

我完全不明白为什么你认为静态成员不是你想要的。我猜想自定义Application对象中的静态映射几乎就是你想要的。 ......我怀疑,从你对WeakHashMaps的评论中,你已经发现了这一点。

...除了你到目前为止所说的没有解释为什么你想让你的地图变弱。在使用弱地图之前,请查看软引用,以确保这不是您的意思。

祝你好运

答案 1 :(得分:4)

编辑:

忘记这个解决方案。这是行不通的。 Android正在处理您传入的Intent .startActivity()。没有办法在活动中获得任何参考。这是 - 在我看来 - 谷歌的好消息。您必须调用您的活动并将对象的引用放在静态成员中......

正如G. Blake Meike所提到的,没有办法通过Intents在Android中传递Object引用。但您可以使用WeakReferences

这里有一个非常优秀的关于这个主题的文章: http://weblogs.java.net/blog/2006/05/04/understanding-weak-references

我通过这个问题得到了解决方案: Is it possible to get the object reference count?

所以我基本上要做的是: 我将使用Intents作为WeakHashMap的键并将我的Object作为值传递。这似乎是唯一适合作为Key的对象,因为您放入Intents附加组件的所有内容都将被序列化。因此,每个Intent只能传递一个Object。你可以在你的Acitivity中实现Subclasses,它可以让你的对象把这个Subclass放到地图中。但是我仍然不确定接收器获取的Intent对象是否与调用者创建的相同,但我认为是这样。如果不是,我将编辑此解决方案(或者可能有人可以清除它)。