繁体   English   中英

如何从Android中的Cordova插件访问CordovaActivity appView?

[英]How to get access to CordovaActivity appView from cordova plugin in android?

我为Android创建了cordova插件,用于处理收到的推送通知。 收到推送后,我想将javascript发送到cordova应用程序的当前webView,如下所示:

appView.sendJavascript("some javascript");

但是问题出在作为科尔多瓦插件创建的活动中,我无法在科尔多瓦应用程序中访问当前WebView的appView。

如果有人可以指导我如何访问cordova pp当前的webView,我将非常感激。

您可以使用反射。

代码答案:

将以下静态字段和初始化程序放在您的课​​程下:

private static Field appViewField;
static {
    try {
        Class<?> cdvActivityClass = CordovaActivity.class;
        Field wvField = cdvActivityClass.getDeclaredField("appView");
        wvField.setAccessible(true);
        appViewField = wvField;
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
}

然后,在“执行”方法下:

try {
    final CordovaWebView webView = (CordovaWebView) appViewField.get(cordova.getActivity());
    Handler mainHandler = new Handler(cordova.getActivity().getMainLooper());
    final Looper myLooper = Looper.myLooper();
    mainHandler.post(new Runnable() {
        @Override
        public void run() {
            // Finally do whatever you want with 'appView', for example:
            webView.clearCache();
            new Handler(myLooper).post(new Runnable() {
                @Override
                public void run() {
                    callbackContext.success();
                }
            });
        }
    });

} catch (Throwable e) {
    callbackContext.error(e.getMessage());
}

细节:

使用反射,我们将appViewprotected appView字段声明CordovaActivity.class在我们的插件类中,以便以后需要时进行访问。

由于该字段由于protected而无法访问,因此我们必须通过调用setAccessible(true);将其手动设置为可访问setAccessible(true);

我们使用另一个线程而不是插件的线程“ JavaBridge”的原因是, appView字段存储在MainLooper的线程上,因此我们必须使用MainLooper访问,完成后,仅在“ JavaBridge”线程下再次调用cordova的callbackContext成功/错误方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM