zoukankan      html  css  js  c++  java
  • Android(H5)互相调用方法

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

  • 相关阅读:
    JavaScript继承
    UML建模概述
    UML建模—EA创建Use Case(用例图)
    UML建模—EA创建Class(类图)
    UML建模—EA的使用起步
    软件设计原则之 单一职责
    docker使用教程
    Fiddler工具使用介绍
    理解Python协程:从yield/send到yield from再到async/await
    如何简单地理解Python中的if __name__ == '__main__'
  • 原文地址:https://www.cnblogs.com/Steffen-xuan/p/11272692.html
Copyright © 2011-2022 走看看