我已经创建了cordova应用程序。我正在运行后台服务以在应用程序中执行某些本机任务。后台服务完成其任务后,我需要触发一个Java脚本事件。是否可以从android触发js事件?找不到任何可靠的答案。我需要事件,因为应用程序正在等待后台服务中的任务完成。我想事件通知应用程序该任务已完成。有没有更好的方法来实现这种逻辑?。
答案 0 :(得分:2)
Cordova本身不会公开公开其Webview属性供其他Java类使用,但是您可以使用最小的Cordova插件来做到这一点,该插件将允许您的后台服务访问Cordova Webview以便从中执行javascript。 Java层。然后,只需注入JS来触发事件即可。
首先,您将创建一个Cordova插件以向您的后台服务公开Cordova的必要元素:
public class MyPlugin extends CordovaPlugin{
private static final String TAG = "MyPlugin";
static MyPlugin instance = null;
static CordovaWebView cordovaWebView;
static CordovaInterface cordovaInterface;
@Override
public void initialize(CordovaInterface cordova, CordovaWebView webView) {
super.initialize(cordova, webView);
instance = this;
cordovaWebView = webView;
cordovaInterface = cordova;
}
@Override
public void onDestroy() {
instance = null;
}
private static void executeGlobalJavascript(final String jsString) {
if (instance == null) {return;}
instance.cordovaInterface.getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
try {
instance.cordovaWebView.loadUrl("javascript:" + jsString);
} catch (Exception e) {
Log.e(TAG, "Error executing javascript: "+ e.toString());
}
}
});
}
public static void triggerJavascriptEvent(final String eventName){
executeGlobalJavascript(String.format("document.dispatchEvent(new Event('%s'));", eventName));
}
}
然后,您的后台服务可以调用该插件类公开的公共方法:
public class MyService {
public static void myMethod(){
MyPlugin.triggerJavascriptEvent("myserviceevent");
}
}
最后,在您的Cordova应用程序的JS层中,您将收听自定义事件:
document.addEventListener('myserviceevent', function(){
console.log("myserviceevent received");
}, false);
我创建了一个示例Cordova项目,其中包含实现此目标所需的最少自定义插件,您可以在此处下载:http://ge.tt/8UeL6lu2
一旦下载,请解压缩然后
cd cordova-test
cordova platform add android
cordova run android