【问题标题】:Phonegap jabber plugin for android适用于 Android 的 Phonegap jabber 插件
【发布时间】:2013-10-08 12:43:50
【问题描述】:

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

【问题讨论】:

    标签: java javascript android plugins cordova


    【解决方案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。就是这样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-28
      • 2012-11-22
      • 2013-09-17
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多