用于android的Phonegap jabber插件

时间:2013-10-08 12:43:50

标签: java javascript android plugins cordova

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

1 个答案:

答案 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。就是这样。