Android(H5)互相调用方法
阅读原文时间:2023年07月11日阅读:1

记录一下前面混合开发时很重要的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.

有两个很重要的方法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);
}

javascrip代码

js的一个方法 get_data()

window.android.get_data("mcontrol");

Android代码

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

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

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

后面再记录下腾讯的webview

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章