我有一个与Service
绑定的活动,并通过Messenger
和Handler
进行通信。当用户点击菜单项时,它会带来一个新的活动,他们可以从ExpandableListView
中选择一些内容。选择完成后,我会在该活动上调用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...
}
}
}
我通过Messenger
Service
Service
对象Message
向msg.replyTo = serviceIncomingHandler;
注册客户Service
Messenger
将其发布为MessageHandler
以用于客户端。
我看到了使用Message Queue的内容,但是如果我向Messenger
类添加了额外的方法,我就失去了从它创建Handler
的能力,我不知道如何将客户的传入Service
注册到Message
,而不向Service
发送msg.replyTo
并设置Messenger
字段。
问题是ExpandableListView Activity
在ListView
启动时获得了GC。我需要这个才能保持活力,因为聊天消息是来回发送的,我希望保留聊天消息的历史记录以重新填充原始ExpandableListView Activity
。当Activity恢复时,历史记录仍然在一个数组中,但是当{{1}}是前景时我无法存储正在发送的消息,因为我的Messenger被杀了。
有没有办法让Messenger保持活力,或者比我目前使用的方法更好?
提前感谢您的帮助!
答案 0 :(得分:0)
我通过对我的情况实施以下答案来实现这一目标。希望这对其他人也有帮助。 Paused Handler Abstract Class
感谢@quickdrawmcgraw