1

对于 jabber 支持,我使用库 Smack。Android 端口 asmack。

我有实现 MessageListener 接口并包含连接、登录、发送消息的方法的类 SmackAPI。同时这个类包含方法:

@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 中监听新消息?

4

1 回答 1

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”方法)。在那里我从可运行的科尔多瓦线程池开始线程,在可运行中我得到了检查消息的递归函数。但在开始可运行之前,我必须获取调用方法执行的方法的 callbackId。此外,为了退出方法,我创建了状态为“NO_RESULT”的新 PluginResult 并将其选项“keepCallback”设置为 true - 这意味着,该方法在 javascript 中调用,等待我的另一个回调结果。当我收到消息时,我根据 callbackid 和我的 webview 创建新的回调上下文,将 setKeepCallback 设置为 true 以获得对 pluginresult 的进一步可能响应,将状态为“OK”的消息放入 pluginresult 并将其发送到 callbackcontext。就这样。

于 2013-10-09T12:41:31.910 回答