Android WebView 加载方式 JS和Java互调方式

本文介绍WebView的四种加载方式,包括加载网页、apk内的HTML页面、本地HTML文件及HTML片段,并详细解析JavaScript与Java间的多种交互方式,如使用javascriptInterface、evaluateJavascript及拦截方式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考博客

https://blog.youkuaiyun.com/u014712086/article/details/78629890

https://blog.youkuaiyun.com/rookie_small/article/details/68488335

1、加载四种方式

 //方式1. 加载一个网页:
  webView.loadUrl("http://www.google.com/");

  //方式2:加载apk包中的html页面
  webView.loadUrl("file:///android_asset/test.html");

  //方式3:加载手机本地的html页面
  webView.loadUrl("content://com.android.htmlfileprovider/sdcard/test.html");

”file:///mnt/sdcard/FMDemoBaseMap/FMMap.html“或者是这个地址

// 方式4: 加载 HTML 页面的一小段内容
  WebView.loadData(String data, String mimeType, String encoding)

说一下第三个和第四个方式

第三个方式需要注意1、该APP要添加本地读写权限;2、如果按第一个写的话,需要重写provider;第三个可以直接加载

2、js与java交互的几种方式

1.javascriptInterface 

java调用js

在java中:

wv_map.loadUrl("javascript:loadMap()");

在js中

 <script>
   function test(){
        document.getElementById("d").innerHTML += " 你好!"
   }
 </script>

js调用java

在java中:

        // 第一步,注册方法
         wv_map.addJavascriptInterface(this, "Android");

        // 第二步,声明方法,通过@JavascriptInterface方式
        //JS需要调用的方法
        @JavascriptInterface
        public void showToast(String arg, String arg1) {
            Toast.makeText(MainActivity.this, arg + arg1, Toast.LENGTH_SHORT).show();
        }

        @JavascriptInterface
        public void goNext() {
            Toast.makeText(MainActivity.this, "点击了", Toast.LENGTH_SHORT).show();
        }
  

在js中:

// window.Android.goNext(),  Android是java中声明的关键字,goNext是java的方法名
<input type="button" value="执行Android方法" onclick="window.Android.goNext()"/>

2、evaluateJavascript方式

/**
     * 使用evaluateJavascript方法,该方法需要API>19
     * 不会去刷新页面,因此效率更高
     */
    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
    public void callJSByEvaluate(FMViewMode mode){
        final int mode1 = mode.getMode();
        // 只需要将第一种方法的loadUrl()换成下面该方法即可
        this.evaluateJavascript(JSMethodHead+"setMapViewMode("+mode1+")", new ValueCallback<String>() {
            @Override
            public void onReceiveValue(String value) {
                //此处为 js 返回的结果
                Toast.makeText(mContext, value, Toast.LENGTH_SHORT).show();
//                Log.d("evaluateJS", value);
            }
        });



    }

3、拦截方式

1.webViewClient.shouldOverrideUrlLoading() 

    /**
     * 在webview界面内点击跳转时触发,加载webview不会触发
     */
    class MyWebViewClient extends WebViewClient {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Log.d("url", url);
            view.loadUrl(url);
            return true;
        }
    }


2.webChromeClient.onconsoleMessage() 

class MyWebChromeClient extends WebChromeClient {
       
        @Override
        public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
            // 监听console打印
            Log.d("console","linenumber:"+consoleMessage.lineNumber()
                    +";message:"+consoleMessage.message()
                    +";level:"+consoleMessage.messageLevel());
            return true;
        }

    }


3.webChromeClient.onJspompt()

class MyWebChromeClient extends WebChromeClient {
        

        @Override
        public boolean onJsConfirm(WebView view, String url, String message, JsResult result) {
            // 确认消息框
            return true;
        }
    }

4、webChromeClient.onJsAlert()

@Override
        public boolean onJsAlert(WebView view, String url, String message, JsResult result) {
            // 监听js的alert打印  警告消息框,如果这里返回true,那么会卡死到这里
 
           Log.d("alert", url + message + result.toString());
            return super.onJsAlert(view,url,message,result);
        }
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值