适用于安卓的Phonegap jabber插件

Phonegap jabber plugin for android

本文关键字:jabber 插件 Phonegap 适用于      更新时间:2023-09-26

对于jabber支持,我使用库Smack。安卓端口。

我有类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中监听新消息?

我做到了。我不知道这是正确的方法,但它有效!

科尔多瓦插件类:

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"调用"执行"方法)。在那里,我从可运行的 cordova 线程池启动线程,在可运行中,我得到了检查消息的递归函数。但是在开始可运行之前,我必须获取调用方法执行的方法的回调 ID。此外,对于从方法退出,我创建状态为"NO_RESULT"的新插件结果,并将其选项"keepCallback"设置为 true - 这意味着,javascript 中的方法调用正在等待我的另一个回调结果。当我收到消息时,我根据回调 id 和我的 web 视图创建新的回调上下文,将 setKeepCallback 设置为 true 以获得对插件结果的进一步可能响应,将状态为"OK"的消息放入插件结果并将其发送到回调上下文。就这样。