Android-强大的WebView

可以做哪些事情?

  • 加载线上 url

    mWebView.loadUrl("https://www.baidu.com");
    
  • 加载本地 html

  • 和 js 进行交互

    • js调用原生 App

          public class TestJSEvent {
              @JavascriptInterface // 4.2以上必须加此注解,否则不生效
              public void showToast(String toast) {
                  Toast.makeText(WebViewActivity.this, toast, Toast.LENGTH_SHORT).show();
              }
          }
      
      // js调用原生 App
      mWebView.addJavascriptInterface(new TestJSEvent(), "TestApp");
      
    • 原生 App调用 js

      mWebView.loadUrl("javascript:javaCallJS('可以传参数')");
      
  • 历史记录

    	WebBackForwardList webBackForwardList = mWebView.copyBackForwardList();
      WebHistoryItem historyItem = webBackForwardList.getItemAtIndex(0);
    	String historyUrl = historyItem.getUrl();
    
  • 导航

    @Override
    public void onBackPressed() {
        // 页面回退,而不直接关闭 Activity
        if (mWebView != null && mWebView.canGoBack()) {
           	mWebView.goBack(); // 回退
    		// mWebView.goForward(); // 前进
    		// mWebView.goBackOrForward(+1); // 回退或前进。steps: 负为回退,正为前进
    		// mWebView.reload(); // 刷新
       } else {
          super.onBackPressed();
       }
    }
    

如何使用?

  • 申请网络权限

    <!-- 声明使用网络的权限 -->
    <uses-permission android:name="android.permission.INTERNET"/>
    
  • 类结构

  • 常用设置

    • WebSettings

      // 打开 JavaScript
       mWebView.getSettings().setJavaScriptEnabled(true);
      
    • WebViewClient

      mWebView.setWebViewClient(new WebViewClient() {
      
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                 // 是否重新加载(拦截页面)
                 return super.shouldOverrideUrlLoading(view, url);
            }
      
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                  return super.shouldOverrideUrlLoading(view, request);
            }
      
            @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);
            }
      
             @Override
             public void onLoadResource(WebView view, String url) {
                  // 加载资源
      			super.onLoadResource(view, url);
             }
      
             @Override
             public void onPageCommitVisible(WebView view, String url) {
                  super.onPageCommitVisible(view, url);
             }
      
             @Nullable
             @Override
             public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                  // 拦截请求
                  return super.shouldInterceptRequest(view, request);
             }
      
             @Override
             public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                  // 加载失败时
      			super.onReceivedError(view, errorCode, description, failingUrl);
             }
      });
      

      方法太多了,这里看几个比较常用的

    • WebChromeClient

      mWebView.setWebChromeClient(new WebChromeClient() {
             @Override
             public void onProgressChanged(WebView view, int newProgress) {
                  // 获取网页加载的进度
                  super.onProgressChanged(view, newProgress);
             }
      
             @Override
             public void onReceivedTitle(WebView view, String title) {
                  // 获取网页的标题
                  super.onReceivedTitle(view, title);
             }
      
      		@Override
              public void onCloseWindow(WebView window) {
                  // 关闭窗口
                  super.onCloseWindow(window);
              }
      
              @Override
              public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
                  // js加载的时候
                  return super.onJsPrompt(view, url, message, defaultValue, result);
              }
      
              @Override
              public boolean onJsBeforeUnload(WebView view, String url, String message, JsResult result) {
                  // js导入的时候
                  return super.onJsBeforeUnload(view, url, message, result);
              }
      
      		@Override
              public void onGeolocationPermissionsShowPrompt(String origin, GeolocationPermissions.Callback callback) {
                  // 位置权限
                  super.onGeolocationPermissionsShowPrompt(origin, callback);
              }
      });
      

      方法太多了,这里看几个比较常用的

更深入的使用

  • Cookie

    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.setCookie("domain", "cookie");
    cookieManager.removeAllCookies();
    
  • History

    WebBackForwardList webBackForwardList = mWebView.copyBackForwardList();
    WebHistoryItem historyItem = webBackForwardList.getItemAtIndex(0);
    String historyUrl = historyItem.getUrl();
    
  • 页面导航

  • Hybird

    Hybrid App(混合模式移动应用)是指介于 Web App(套壳)、Native App(原生)这两者之间的 App ,兼具“ Native App 良好用户交互体验的优势 ”和“ Web App 跨平台开发的优势 ”。

  • 如何拦截网络请求

    @Nullable
    @Override
     public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
        // 拦截请求
        return super.shouldInterceptRequest(view, request);
    }
    
  • 如何显示进度

    @Override
    public void onProgressChanged(WebView view, int newProgress) {
        // 获取网页加载的进度
        super.onProgressChanged(view, newProgress);
    }
    
  • 调试

    WebView.setWebContentsDebuggingEnabled(true);
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值