为什么onDestroy不会杀死它的方法?

时间:2014-06-16 13:34:51

标签: android android-lifecycle asmack

我正在Android上进行xmpp聊天。我有下一个情况: 1)我有单人班,有XMPPConnection和2个活动。 2)第一个活动只是一个联系人列表,我可以选择并启动消息。 3)在第二个活动(聊天)中,我为我的连接设置了监听器,并在收到来自特定联系人的消息时添加一些播放的信号。 4)然后我关闭聊天活动并调用onDestroy方法。 5)然后,如果我发信息给我的应用程序 - 我听到信号,它在被破坏的活动中播放(我的意思是播放信号的方法必须通过聊天活动来销毁)。

请解释我为何可能。

    public class ChatActivity extends ActionBarActivity {
    ...
    public void beep() {
            Uri notification = RingtoneManager
                    .getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
            RingtoneManager.getRingtone(getApplicationContext(), notification).play();
        }
    ...

    public void setupListeners(XMPPConnection connection) {
            if(connection != null) {
                //Set a listener for chat messages
                connection.addPacketListener(new PacketListener() {
                    @Override
                    public void processPacket(Packet packet) {
                        Message message = (Message) packet;
                        if (message.getBody() != null && message.getFrom()
                                .contains(chatModel.getRecipient())) {
                            chatModel.addMessage(StringUtils.parseBareAddress(message.getFrom())
                                    + " :" + message.getBody());
                            beep();
                        }
                    }
                }, new MessageTypeFilter(Message.Type.chat));

                //Set a listener for normal messages
                connection.addPacketListener(new PacketListener() {
                    @Override
                    public void processPacket(Packet packet) {
                        Message message = (Message) packet;
                        if(message.getBody() != null && message.getFrom()
                                .contains(chatModel.getRecipient())) {
                            chatModel.addMessage(StringUtils.parseBareAddress(message.getFrom())
                                    + " :" + message.getBody());
                            beep();
                        }
                    }
                }, new MessageTypeFilter(Message.Type.normal));
       }
   }

2 个答案:

答案 0 :(得分:2)

退出Objects时,Java中的

Activity不会立即销毁。此外,您无法手动调用垃圾收集器。您可以做的是使onDestroy()方法中的对象无效:

connection = null;

答案 1 :(得分:2)

您是否尝试在活动的onDestroy中断开连接?或者删除听众? 由于这些内部类(它们包含对其外部类的(隐藏)引用 - 在这种情况下是您的Activity,因此Activity可能无法进行垃圾回收。因此,删除侦听器或断开连接应该可以解决问题。

编辑:像Gusdor所说,你想要删除onPause()方法中的监听器,并在onResume()中再次添加它们。

Edit2:如果您希望XMPP Connection在后台运行,您应该考虑使用后台服务来处理Connection和消息,而不是活动。