首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >android触发javascript事件

android触发javascript事件
EN

Stack Overflow用户
提问于 2019-03-01 06:23:11
回答 1查看 627关注 0票数 3

我已经创建了一个cordova应用程序。我正在运行一个后台服务来执行应用程序中的一些本机任务。我需要在后台服务完成其任务后触发一个java-script事件。是否可以从android触发js事件?找不到任何可靠的答案。我需要事件,因为应用程序将等待后台服务中的任务完成。我想通过事件通知应用程序任务已完成。有没有更好的方法来实现这个逻辑?

EN

回答 1

Stack Overflow用户

发布于 2019-03-01 16:51:53

Cordova本身并不公开其webview属性以供其他Java类使用,但您可以使用一个最小的Cordova插件来做到这一点,该插件允许您的后台服务访问Cordova webview,以便从Java层执行其中的javascript。然后就是注入JS来触发事件的问题了。

首先,您需要创建一个Cordova插件来向您的后台服务公开Cordova的必要元素:

代码语言:javascript
运行
AI代码解释
复制
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));
    }
}

然后,您的后台服务可以调用该插件类公开的公共方法:

代码语言:javascript
运行
AI代码解释
复制
public class MyService {
    public static void myMethod(){
        MyPlugin.triggerJavascriptEvent("myserviceevent");
    }
}

最后,在Cordova应用程序的JS层中,您将侦听自定义事件:

代码语言:javascript
运行
AI代码解释
复制
document.addEventListener('myserviceevent', function(){
    console.log("myserviceevent received");
}, false);

我已经创建了一个示例Cordova项目,其中包含实现此目标所需的最低限度的自定义插件,您可以在此处下载:http://ge.tt/8UeL6lu2

下载后,解压:

代码语言:javascript
运行
AI代码解释
复制
cd cordova-test
cordova platform add android
cordova run android
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54939027

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档