在进行Android远程和前端混合开发时,经常需要在WebView中获取或者拦截JS方法的返回值。比如在web页面中点击【退出】按钮,会发送一个标志退出的参数(一般为String类型),然后WebView拦截该参数,调用finish()方法,进行原生界面的退出。
本人将在项目开发中拦截JS参数,调用原生方法的经验总结如下:
1.原生WebView中
mSystemWebViewClient = new SystemWebViewClient(mSystemWebViewEngine) {
//页面开始加载时,进行调用
@Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
}
//拦截点击要跳转的请求,并可以对当前请求做出修改(从API 21引入)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
return super.shouldInterceptRequest(view, request);
}
//拦截点击要跳转的url链接,并可以对请求的url做出修改(从API 21弃用)
@Override
public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
return super.shouldInterceptRequest(view, url);
}
//拦截页面跳转url(注意:点击web页面中的请求链接时,才会调用此方法)
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if ("cmss://closewebview".equalsIgnoreCase(url)) {
finish();
}
return super.shouldOverrideUrlLoading(view, url);
}
//页面加载完成后,进行调用
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
}
};
mSystemWebView.setWebViewClient(systemWebViewClient);
2.在使用Cordova插件进行开发时,我们可以自定义一个Cordova插件类,它继承CordovaPlugin覆写execute方法,可以进行返回值的拦截,进行相应的原生操作。
public class CustomPlugin extends CordovaPlugin {
private static final String TAG = CordovaPlugin.class.getSimpleName();
@Override
public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException {
if ("closeSubsystem".equals(action)) {
Logger.d(TAG, "closeSubsystem");
this.cordova.getActivity().finish();
return true;
} else if ("reLoginDocument".equals(action)) {
Logger.d(TAG, "reLoginDocument");
((CordovaViewActivity) CustomPlugin.this.cordova.getActivity()).reLoginSubSystem(callbackContext);
return true;
}
...
return false;
}
}