对于jabber支持我使用库Smack。 Android端口asmack。
我有类SmackAPI,它实现了MessageListener接口,并包含连接,登录,发送消息的方法。同时这个类包含方法:
@Override
public void processMessage(Chat chat, Message message) {
String from = message.getFrom();
String body = message.getBody();
System.out.println(String.format("Received message '%1$s' from %2$s", body, from));
this.recievedMessage = message;
}
它由MessageListener接口提供。此方法处理的所有新消息。
我编写了jabber插件来连接,登录,从phonegap发送消息。
我的问题:我如何在javascript中收听新消息?
答案 0 :(得分:1)
我做到了。我不知道这是正确的方法,但它确实有效!
Cordova插件类:
public class SmackJabber extends CordovaPlugin {
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
this.cbContext = callbackContext;
switch (action) {
case LISTEN_MESSAGE:
res = new PluginResult(PluginResult.Status.NO_RESULT);
res.setKeepCallback(true);
cordova.getThreadPool().execute(new Runnable() {
@Override
public void run() {
String callbackId = cbContext.getCallbackId();
while (true) {
String msg = getMsg();
if (msg != null) {
res = new PluginResult(PluginResult.Status.OK, msg);
res.setKeepCallback(true);
CallbackContext cb = new CallbackContext(callbackId, webView);
cb.sendPluginResult(res);
}
}
}
});
cbContext.sendPluginResult(res);
break;
简单的javascript。只需调用插件方法:
window.plugins.smackJabber.listenMessage(function(result) {
alert(result)
}, function(error) {
alert(error)
}
);
说明: 我调用插件方法“listenMessage”(使用操作“LISTEN_MESSAGE”调用“execute”方法)。在那里我用cordnable从cordova线程池启动线程,在runnable中我得到了检查消息的递归函数。但是在开始运行之前我必须采用调用方法执行的方法的callbackId。另外,为了退出方法,我创建状态为“NO_RESULT”的新PluginResult并将其选项“keepCallback”设置为true - 这意味着,该方法调用javascript等待我的一个回调结果。当我收到消息时,我基于callbackid和我的webview创建新的callbackcontext,将setKeepCallback设置为true以获得pluginresult的更多可能响应,将pluginresult放入状态为“OK”的消息并将其发送到callbackcontext。就是这样。