如何使用cordova/phonegap将数据或消息从java应用程序/插件发送到javascript

如何使用cordova/phonegap将数据或消息从java应用程序/插件发送到javascript,cordova,phonegap-plugins,cordova-plugins,Cordova,Phonegap Plugins,Cordova Plugins,我想我遗漏了什么。我习惯于将数据从javascript发送到java,然后通过调用执行返回,再通过callbackContext方法返回 但是,如果在某些时候,假设我有一个正在运行的线程需要定期向javascript发送数据,那么我应该怎么做呢?(假设此任务正在运行且未被javascript操作触发,因此没有可用的callbackContext)如果您需要的是以异步方式从服务器到客户端的通信,那么WebSocket是您的解决方案。确切的实现取决于您使用的web服务器,所以您可能需要提供更多的细节

我想我遗漏了什么。我习惯于将数据从javascript发送到java,然后通过调用执行返回,再通过callbackContext方法返回


但是,如果在某些时候,假设我有一个正在运行的线程需要定期向javascript发送数据,那么我应该怎么做呢?(假设此任务正在运行且未被javascript操作触发,因此没有可用的callbackContext)

如果您需要的是以异步方式从服务器到客户端的通信,那么WebSocket是您的解决方案。确切的实现取决于您使用的web服务器,所以您可能需要提供更多的细节,但它们或多或少都以相同的方式工作

您始终可以从java执行javascript,这样做:

String js = "alert('test')";
webView.loadUrlNow("javascript:" + js);
或者您可以初始化插件并让回调函数继续这样做

PluginResult pgRes = new PluginResult(PluginResult.Status.OK, "message");
pgRes.setKeepCallback(true);
callbackContext.sendPluginResult(pgRes);
添加了Sephy提供的示例

private String myCbkId;
// Store callbackId from a call to execute 
@Override public boolean execute(String action, JSONArray arr, CallbackContext cbkCtx) throws JSONException { 

    myCbkId = cbkCtx.getCallbackId(); 
    JSONObject data = arr.getJSONObject(0); 
    String ack = data.getString("data"); // You can acknowledge to the callback for instance and keep it alive 
    Log.d(TAG, "ack".equals(ack) ? "ack !" : "not ack !");

    // These lines can be reused anywhere in your app to send data to the javascript
    PluginResult result = new PluginResult(PluginResult.Status.OK, ack);
    result.setKeepCallback(true);//This is the important part that allows executing the callback more than once, change to false if you want the callbacks to stop firing  
    this.webView.sendPluginResult(result, this.myCbkId); 

    return true; 
}

我不确定你是否了解我的问题,我正在尝试在我的java插件和用cordova包装的web应用程序之间进行对话……我没有尝试进行HTTP/WS通信。对,对不起。你看到了吗?在你提到这个之前,我没有看到过,谢谢。但是1)它是一个过时的bi,因为脱离了Cordova 3,一些东西随着插件而改变。2) 这个问题对我来说不是很清楚,当您想用Cordova/Phonegap从java到js进行通信时,它并没有提供一个清晰的通用解决方案来重用。如果我理解得很好,它主要解释了如何从js到java进行通信,我已经知道如何进行通信。你的插件支持哪些平台?目前,只有android。我希望在接下来的几个月里也能支持ios是的,这就是我最后要做的,但是这需要一些解释和更多的细节,让那些通过这个答案来理解这一点的人知道。稍后我将发布我的解决方案,以便与您的解决方案进行比较。哪一个需要更多解释?第一个很简单,就是从java执行javascript的方式。第二部分可能需要一些解释,但你的问题也很模糊,似乎你只是需要定位,你没有要求一个完整的例子这是我的完整解决方案。如果你同意在你的答案中发布更详细的版本,我会检查你的答案。谢谢你的指点!//存储调用中的callbackId以执行@Override public boolean execute(String action,JSONArray arr,CallbackContext cbkCtx)抛出JSONException{myCbkId=cbkCtx.getCallbackId();JSONObject data=arr.getJSONObject(0);String ack=data.getString(“数据”);//例如,您可以确认回调并使其保持活动Log.d(标记“ack”.equals(ack)?“ack!”:“not ack!”);//这些行可以在应用程序中的任何位置重用,以将数据发送到javascript PluginResult result=new PluginResult(PluginResult.Status.OK,ack);result.setKeepCallback(true);this.webView.sendPluginResult(结果,this.myCbkId);返回true;}