簡體   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