Smack:消息基础

来回发送消息的核心是即时消息。尽管个别的消息可以作为packet发送和接收,通常使用org.jivesoftware.smack.Chat类,字符串消息作为一个chat更容易处理。 

 

Chat 

chat创建在两个用户之间一个新消息线程(使用一个线程ID)。下面的代码段演示了如何创建一个用户新的Chat,然后向他们发送文本消息。 

// Assume we've created a Connection name "connection".  
ChatManager chatmanager = connection.getChatManager();  
Chat newChat = chatmanager.createChat("[email protected]", new MessageListener() {  
    public void processMessage(Chat chat, Message message) {  
        System.out.println("Received message: " + message);  
    } 
});  
try {  
    newChat.sendMessage("Howdy!");  
} catch (XMPPException e) {  
    System.out.println("Error Delivering block");  
} 

Chat.sendMesage(String)方法是创建一个消息对象很方便的方法,使用字符串参数设置body,然后发送消息。在这种情况下你想在消息发送前设置额外的值,使用Chat.createMessage()和Chat.setMessage(Message)方法,正如下面的代码片段:  

Message newMessage = new Message(); 
newMessage.setBody("Howdy!"); 
message.setProperty("favoriteColor", "red"); 
newChat.sendMessage(newMessage); 
你也将注意到在这个例子前面,我们在创建一个chat的时候指定了一个消息监听器。这个监听器在chat中任何消息从其他的用户抵达的时候被通知。下面的代码段使用这个监听器作为parrot-bot--它返回其他用户类型发送的一一切。  

// Assume a MessageListener we've setup with a chat. 
public void processMessage(Chat chat, Message message){ 
    // Send back the same text the other user sent us. 
    chat.sendMessage(message.getBody());  
} 
传入Chat  

当chat由其他用户发起的时候,因为你首先获取一个chat消息,这个步骤略有不同。替代明确创建一个chat来发送消息,你需要注册器来处理新创建的Chat实例,当ChatManager创建它们的时候。 

 

ChatManager将找到一个匹配的chat(通过线程id),如果没有已存在的时候,它将会创建一个新的匹配。为了获取这个新的chat,你必须注册当它发生的时候被通知。你能注册一个消息监听器来获取所有功能消息作为这个handler的一部分。 

// Assume we've created a Connection name "connection".  
ChatManager chatmanager = connection.getChatManager().addChatListener( new ChatManagerListener() {  
@Override  
public void chatCreated(Chat chat, boolean createdLocally) {  
    if (!createdLocally)  
        chat.addMessageListener(new MyNewMessageListener());; 
     }  
}); 
除了基于线程的chat消息,也有一些客户端没有发送一个线程id作为chat的一部分。为了处理这中场景,Smack将会尝试让最适合的存在的chat匹配传入的消息,基于JID。它将尝试找到一个完全相同JID的chat,如何这个失败,它将会尝试基于JID。如果没有用户能找到的存在的chat,然后就会创建一个新的。  

你可能感兴趣的:(android,smack,message,XMPP)