Java 使Messenger在服务和活动之间保持活动状态
我有一个绑定到服务并通过信使和处理程序进行通信的活动。当用户单击菜单项时,会出现一个新的活动,用户可以从ExpandableListView中选择一些内容。选择完成后,我调用该活动的finish,并返回main活动。main活动在该过程中保持绑定状态,因为我在其onDestroy中调用了我的unbind。我把我的服务交给了客户端的处理程序。这是我创建的一个Messenger,如下所示:Java 使Messenger在服务和活动之间保持活动状态,java,android,android-activity,android-service,Java,Android,Android Activity,Android Service,我有一个绑定到服务并通过信使和处理程序进行通信的活动。当用户单击菜单项时,会出现一个新的活动,用户可以从ExpandableListView中选择一些内容。选择完成后,我调用该活动的finish,并返回main活动。main活动在该过程中保持绑定状态,因为我在其onDestroy中调用了我的unbind。我把我的服务交给了客户端的处理程序。这是我创建的一个Messenger,如下所示: //Target to allow service to send message to InccomingH
//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...
}
}
}
我通过向服务发送消息对象msg.replyTo=serviceincomminghandler,向服务注册客户端的Messenger;在服务端,我将其发布为用于客户端的Messenger
我看到了使用消息队列的情况,但是如果我向MessageHandler类添加额外的方法,我就失去了从中创建Messenger的能力,我不知道如何在不向服务发送消息并设置msg.replyTo字段的情况下将客户机的传入处理程序注册到服务
问题是,当ExpandableListView活动启动时,Messenger会得到GC'd。我需要它来保持活动状态,因为聊天信息被来回发送,我想保留聊天信息的历史记录以重新填充原始ListView。当活动恢复时,历史记录仍在数组中,但当ExpandableListView活动处于前台时,我无法存储正在发送的消息,因为我的Messenger被终止
有没有办法让Messenger保持活力,或者有比我目前使用的更好的方法
提前感谢您的帮助 我通过实施以下针对我的情况的答案来实现这一点。希望这也能帮助其他人。
感谢@quickdrawmcgraw为什么在ListViewActivity启动时Messenger会收到GC?你不是在某处保留对这个对象的引用吗?这听起来不对。@DavidWasser,因为我假设ListViewActivity是一个新的活动?如果队列中没有任何消息,并且启动了一个新的活动,我猜VM会说我们已经完成了分配…?您将Messenger的引用保存在哪里?在哪项活动中?