记录一下前面混合开发时很重要的java与js互调方法进行数据交互。

混合开发就需要webview这个控件了

这就很玄学了,哈哈哈

这篇文章https://www.jianshu.com/p/3d9a93c9fea2可以看看

先来设置一下webview。WebSettings用于管理WebView状态配置

public static boolean WebViewSetting(Activity activity, WebView webview) {

        final WebSettings webSettings = webview.getSettings();

        webSettings.setDomStorageEnabled(true);// 主要是这句
        webSettings.setJavaScriptEnabled(true);// 启用js
        webSettings.setBlockNetworkImage(false);// 解决图片不显示
        webSettings.setSavePassword(false);
        webSettings.setDefaultTextEncodingName("utf-8");//设置编码格式
        webSettings.getSettings().setBuiltInZoomControls();//设置是否支持缩放
        webSettings.addJavascriptInterface(obj,str);//向html页面注入java对象
        webSettings.setUseWideViewPort(true);//设置此属性,可任意比例缩放
        webSettings.setLoadWithOverviewMode(true);// 页面支持缩放:
        webSettings.setJavaScriptEnabled(true);
        webSettings.setBuiltInZoomControls(true);
        webUrl.requestFocusFromTouch(); //如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点。
        webSettings.setJavaScriptEnabled(true);  //支持js
        webSettings.setUseWideViewPort(false);  //将图片调整到适合webview的大小
        webSettings.setSupportZoom(true);  //支持缩放    webSettings.setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
        webSettings.supportMultipleWindows();  //多窗口
        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);  //关闭webview中缓存
        webSettings.setAllowFileAccess(true);  //设置可以访问文件
        webSettings.setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口
        webSettings.setLoadWithOverviewMode(true); // 缩放至屏幕的大小
        webSettings.setLoadsImagesAutomatically(true);  //支持自动加载图片

        // 让JavaScript可以自动打开windows设置允许JS弹窗
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        // 设置缓存
        webSettings.setAppCacheEnabled(false);
        // 设置缓存模式,一共有四种模式
//        webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        // 设置缓存路径
        webSettings.setAppCachePath("");
        // 支持缩放(适配到当前屏幕)
        webSettings.setSupportZoom(true);
        // 将图片调整到合适的大小
        webSettings.setUseWideViewPort(true);
        // 支持内容重新布局,一共有四种方式
        // 默认的是NARROW_COLUMNS
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.SINGLE_COLUMN);
        // 设置默认字体大小
        webSettings.setDefaultFontSize(12);
        // 支持缩放
        webSettings.setSupportZoom(false);
        //设置支持两指缩放手势
        webSettings.setBuiltInZoomControls(false);

        return true;
    }

下面重要的来了

addJavascriptInterface是WebKit的原生API,属于WebView对象的公共方法,用于暴露一个java对象给js,使得js可以直接调用方法。

由于它不安全,4.2后新增了@JavascriptInterface注解

还有个框架:https://github.com/lzyzsd/JsBridge  ---这个项目在Java和JavaScript之间架起了桥梁。

现在要开始加载页面了 webview.loadUrl("https://www.baidu.com/");

@SuppressLint("JavascriptInterface")
    private void initMixedPage() {

        //封装webview
        NativeWebViewUtil nativeWebViewUtil = new NativeWebViewUtil();
        nativeWebViewUtil.WebViewSetting(this,webview);
        //添加Javascript的映射
        webview.addJavascriptInterface(this,"android");
        webview.loadUrl("https://www.baidu.com");
        webview.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                // 加载页面
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                

                // 加载结束
                webview.evaluateJavascript("javascript:get_android_base("aaa")", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {
                        //此处为 js 返回的结果
                        Log.v("Native",value);
                    }
                });
            }
        });

    }

没有回掉可以写null.

第一、Android调用js

有两个很重要的方法setWebChromeClient和setWebClient

setWebChromeClient主要处理解析,渲染网页等浏览器做的事情

WebChromeClient是辅助WebView处理Javascript的对话框等

要调用js就要等webview加载完成后再调用js方法

webview.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageStarted(WebView view, String url, Bitmap favicon) {
                super.onPageStarted(view, url, favicon);
                // 加载页面

                
            }

            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                
                // 加载结束js 方法 get_android_base
                webview.evaluateJavascript("javascript:get_android_base("aaa")", new ValueCallback<String>() {
                    @Override
                    public void onReceiveValue(String value) {
                        //此处为 js 返回的结果
                        Log.v("Native",value);
                    }
                });
            }
        });

javascript代码

接收android发来的数据

function get_android_base(base){
    alert(base);
}

第二、js调用Android

javascrip代码

js的一个方法 get_data()

window.android.get_data("mcontrol");

 Android代码

@JavascriptInterface
public void get_data(String base){
    Log.d(TAG,base);
}

 到这里,简单的互调就完成了。

互调就很玄学,总是有各种各样的问题哈哈哈。

后面再记录下腾讯的webview