[英]Cordova backbutton destroy the CordovaActivity after use own plugin
[英]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());
}
使用反射,我們將appView
的protected
appView
字段聲明CordovaActivity.class
在我們的插件類中,以便以后需要時進行訪問。
由於該字段由於protected
而無法訪問,因此我們必須通過調用setAccessible(true);
將其手動設置為可訪問setAccessible(true);
我們使用另一個線程而不是插件的線程“ JavaBridge”的原因是, appView
字段存儲在MainLooper
的線程上,因此我們必須使用MainLooper
訪問,完成后,僅在“ JavaBridge”線程下再次調用cordova的callbackContext成功/錯誤方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.