我特别感谢official android FAQ的以下建议。
WeakReferences to Objects的HashMap
您还可以将WeakReferences的HashMap用于具有长键的对象。当活动想要将对象传递给另一个活动时,它只是将对象放入地图中,并通过意图附加功能将密钥(基于计数器或时间戳的唯一Long)发送给收件人活动。收件人活动使用此密钥检索对象。
我还没有找到如何正确实现这一点的方法。而且我不确定为什么WeakReferences在这里是首选,为什么不使用硬引用。
我的实施(我想将类XY 的实例从活动A 发送到服务B ):
接收服务有一个静态的对象HashMap。
public static HashMap<Long, Object> parameters = new HashMap<Long, Object>();
发送部分的代码(活动A)
long key = SystemClock.elapsedRealtime();
B.parameters.put(key, new XY());
Intent i = new Intent(this, B.class);
i.putExtra("PARAM_UPLOAD", key);
startService(i);
接收部分的代码(服务B)
long key = intent.getLongExtra("PARAM_UPLOAD", -1);
XY data = (XY)parameters.get(key);
代码使用的是硬引用。我为什么要在这里使用弱引用(如FAQ所提出的)?并且这样的使用模式可以传递数据,或者您更喜欢其他内容。
答案 0 :(得分:5)
为什么我应该在这里使用弱引用(如FAQ所提出的)?
因为你在泄漏记忆。你放入静态HashMap
的任何内容都不会被垃圾收集。
这是一种用于传递数据的使用模式,还是您更喜欢别的东西。
我更喜欢在活动之间传递简单数据。任何非原始的(或系统提供的Parcelable
,如PendingIntent
)都应被视为数据模型的一部分,并应如此管理。 Here is a blog post我会详细介绍。