WebView获取JS返回值

在进行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;
    }

}

你可能感兴趣的:(Android应用开发)