【发布时间】:2014-01-03 04:14:47
【问题描述】:
我有一个绑定到Service 并通过Messengers 和Handlers 进行通信的活动。当用户点击一个菜单项时,它会带来一个新的活动,他们可以从ExpandableListView 中选择一些东西。做出选择后,我在该 Activity 上调用 finish() 并带回 MainActivity。 MainActivity 在此过程中保持绑定,因为我在其 onDestroy() 中调用了我的 unbind。我将我的Service 交给客户传入Handler。这是我这样创建的Messenger:
//Target to allow service to send message to InccomingHandler
final Messenger serviceIncomingHandler = new Messenger(new MessageHandler(this));
/**
* Message Handling from Service
*/
private static class MessageHandler extends Handler {
private final WeakReference<RoomListActivity> mTarget;
public MessageHandler(RoomListActivity target) {
mTarget = new WeakReference<RoomListActivity>(target);
}
@Override
public void handleMessage(Message msg) {
RoomListActivity target = mTarget.get();
switch (msg.what) {
//Fancy stuff here...
}
}
}
我通过发送Service 和msg.replyTo = serviceIncomingHandler; 向Service 注册客户的Messenger 对象msg.replyTo = serviceIncomingHandler; 在Service 方面,我将其发布为Messenger 以供客户使用.
我看到了一些使用消息队列的东西,但是如果我向我的 MessageHandler 类添加额外的方法,我失去了从中创建 Messenger 的能力,而且我不知道如何注册客户的传入Handler 到 Service 而不发送 Message 到 Service 并设置 msg.replyTo 字段。
问题是Messenger 在ExpandableListView Activity 启动时被GC'd。我需要这个来保持活力,因为聊天消息被来回发送,我想保留聊天消息的历史记录以重新填充原始ListView。当 Activity 恢复时,历史仍然在一个数组中,但是我无法存储在 ExpandableListView Activity 是前台时正在发送的消息,因为我的 Messenger 被杀死了。
有没有办法让 Messenger 保持活跃,或者比我目前使用的更好的方法?
提前感谢您的帮助!
【问题讨论】:
-
为什么
Messenger在ListViewActivity启动时会被GC'd?你不是在某处保留对这个对象的引用吗?这听起来不对。 -
@DavidWasser 因为
ListViewActivity是一个新的Activity,我假设?如果队列中没有任何消息,并且启动了一个新的Activity,我猜虚拟机说我们已经完成了那个分配......? -
你将
Messenger的引用保存在哪里?在哪个活动中?
标签: java android android-activity android-service