[英]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.