cordova插件 - 将js函数传递给本机代码

时间:2016-06-20 08:10:39

标签: cordova cordova-plugins

我正在尝试编写一个Cordova插件,它将启动一个线程来定期收集信息。

其中一个信息是在js图层中维护。所以我需要提供一个由本机代码调用的js getter函数。

以下是演示代码:

in js:
var getInfo = function() {

  xxxxxxxxxxxxxxx

  return jsInfo;
}

// call my plugin
cordova.startCollectInfo(getInfo)

如何调用java代码getInfo并获取jsInfo的值?

1 个答案:

答案 0 :(得分:2)

如果将getInfo()函数作为成功回调传递给本机插件层,则可以使用setKeepCallback(true)阻止Cordova在第一次调用后放弃对JS回调的引用,然后存储引用回调上下文,允许您多次调用JS回调以响应您调用的本机线程操作。像这样:

myplugin.js:

var getInfo = function(jsInfo) {

  xxxxxxxxxxxxxxx

  return jsInfo;
}

var getInfoError = function(error){
    console.error("An error occurred: " + error);
}

// call my plugin
cordova.exec(getInfo,
    getInfoError,
    'MyPlugin',
    'startCollectInfo',
[]);

MyPlugin.java

public class MyPlugin extends CordovaPlugin{
    private CallbackContext getInfoCallbackContext;

    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
        if (action.equals("startCollectInfo")){
            this.getInfoCallbackContext = callbackContext;
            PluginResult r = new PluginResult(PluginResult.Status.NO_RESULT);
            r.setKeepCallback(true);
            callbackContext.sendPluginResult(r);
        }
        return true;
    }

    public void onSomeThreadOperationResult(String[] someResults){
        String jsInfo = convertToJson(someResults);
        PluginResult r = new PluginResult(PluginResult.Status.OK, jsInfo);
        r.setKeepCallback(true);
        this.getInfoCallbackContext.sendPluginResult(r);
    }
}