Java 使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

我有一个绑定到服务并通过信使和处理程序进行通信的活动。当用户单击菜单项时,会出现一个新的活动,用户可以从ExpandableListView中选择一些内容。选择完成后,我调用该活动的finish,并返回main活动。main活动在该过程中保持绑定状态,因为我在其onDestroy中调用了我的unbind。我把我的服务交给了客户端的处理程序。这是我创建的一个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...
        }
    }
}
我通过向服务发送消息对象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的引用保存在哪里?在哪项活动中?