Android WebView详解

WebView用于展示网页,这个类可以使你在activity中滚动网页和简单地显示网页内容。
类结构如下:

Android WebView详解_第1张图片

一、 基本使用

1.1 在AndroidManifest添加网络权限:

这里写图片描述

1.2 如果你的需求实现想展示网页,不涉及到和应用的交互,可以直接使用手机本身带有浏览器服务的应用,如自带浏览器,第三方应用(UC、QQ等):

Uri uri = Uri.parse("http://www.example.com");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);

1.3 加载网页:
     1.3.1 加载url

webview.loadUrl("http://www.example.com");

     添加请求头:

Map<String ,String> request = new HashMap();
request.put("agent", "android");
mWebView.loadUrl(loadUrl, request);

     1.3.2 直接加载html标签内容
     你也可以通过html string 来加载网页,如:

String htmlStr= "<html><body>You scored <b>185b> points.body>html>";
webview.loadData(htmlStr , "text/html", null);

     1.3.3 加载本地资源

webview.loadUrl("file:///android_asset/example.html");


二、 使用特点

     2.1 WebChromeClient和WebViewClient接口
     WebChromeClient用于辅助js的对话框,加载进度等;
     WebViewClient则用于辅助各种通知、请求事件等。

     2.2 Cookie
          CookieSyncManager和CookieManager可以实现webview在请求是保住cookie请求状态,如下:

    CookieSyncManager.createInstance(this);
    CookieManager cookieManager = CookieManager.getInstance();
    cookieManager.setAcceptCookie(true);
    cookieManager.removeSessionCookie();
    cookieManager.setCookie(ROOT_URL, onGetCookie());
    CookieSyncManager.getInstance().sync();

2.3 javascript交互
当需要和网页内容进行交互时,即和javascript进行交互,方法如下:
1) 设置支持javascript
   setJavaScriptEnabled(true);

2) 添加回调的入口
   addJavascriptInterface(this, “test”);

3) 交互
   App端:可通过webview调用loadUrl(“javascript:method(param)”)方法来实现加载web端的方法;
   web端:加载通过addJavascriptInterface添加进来的对象的方法,为了调用的安全,需要在被调用的方法前面加
          @JavascriptInterface声明。

   (参数返回:4.4之前,通过java和js端互调来实现参数的返回,
   后来就提供了相应的接口来实现这需求:

        webView.evaluateJavascript("testParam(0,1)", new ValueCallback() {
            @Override
            public void onReceiveValue(String arg0) {
            //result callback
            }
        });)

2.4 get、post请求
   get: 直接使用loadUrl方法
   post:使用postUrl方法,

String postDate = "userName=abc&date=20160928";
webview.postUrl("www.xingyu.com",EncodingUtils.getBytes(postDate, "BASE64"));

2.5 https请求
   Webview也可以支持https的请求,即实现WebViewClient的onReceivedSslError方法,实现如下:

webview.setWebViewClient(new WebViewClient(){   
            @Override
            public void onReceivedSslError(WebView arg0, SslErrorHandler arg1, SslError arg2) {
                arg1.proceed();//接收证书
            }
        });

2.6 网页往回
   在实际网页交互的过程中,当用户按下返回键时,往往是想返回到页面的上一级,而不是直接关闭网页,这样就需要对返回事件进行拦截和处理,理由webview的返回栈进行页面的返回操作,代码如下:

 @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if(keyCode == KeyEvent.KEYCODE_BACK) {
            if(webview.canGoBack()) {
                webview.goBack();
                return true;
            } else {
                finish();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

2.7 webview缓存
   Dom Storage:存储键值对key/value,5M大小,较大缓存,存储简单:

  webSettings.setDomStorageEnabled(true);

   Indexed Database:数据库存储,存储空间更大

  webSettings.setJavaScriptEnabled(true);

   缓存控制:(配合相应的标志位使用)

  webSettings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); 

   清除缓存:

  webview.clearCache(true);
  webview.clearHistory();

2.8 资源预加载
   首次加载过程中,可以预先加载图片等资源来优化页面的加载效率,可以通过接口来实现该需求:

webview.setWebViewClient(new WebViewClient(){
    @Override
    public WebResourceResponse shouldInterceptRequest(WebView arg0,String arg1) {
        WebResourceResponse wrr = null;
        //getResourcePreLoading
        //……
        return wrr;
        }
    });

2.9 屏幕自适应
   webview可以实现加载的页面进行屏幕的适配:

getSettings().setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN);
getSettings().setLoadWithOverviewMode(true);


三、 常见问题

   3.1 内存泄漏
      之前在开发过程中,常碰到的一个问题就是当页面加载内容大的时候,容易遇到内存泄漏的问题,
   解决该问题的常用方法有两个:

   1)弱化activity和webview的关联,即可以直接在运行的时候讲webview添加到布局中来,
   并且出入的context为application:

rootView.addView(new WebView(getApplicationContext()), 0);

   (此做法在webview 中网页带有的flash弹出dialog可能会失效)

   2)独立进程中运行webview。另开个进程来加载webview,并通过AIDL和主进程进行通信,用完后就直接销毁进程,这样就
   算是内存泄漏了也不影响到主进程,当然这种方式设计到进程通信,相比第一种会麻烦些。

   3.2 getSettings().setBuiltInZoomControls(true)
      用户在使用该方法进行缩放控制,当触摸到屏幕时,会出现控制的图标,该图标一会后会自动消失。但在这过程中退出
    activity的话,一些系统版本会出现奔溃问题,原因是该图标找不多了所依附的window而出现奔溃问题,解决该问题的
    最简单的做法是在activity的ondestroy方法中隐藏webview,即 webview.setVisibility(View.GONE);

   3.3 webview页面播放音频,退出后扔播放:
      可以直接调用destroy()方法来关闭音频,即webView.destroy();

四、 浏览器内核

   在应用开发的过程中,安卓端比较麻烦的意见事情就是机型适配,在使用原生的webview的时候由于厂商对系统做了处理,所以各个机型对于不同的网页也产生不一样的渲染效果。为了弥补这个问题,可以考虑统一使用相同的浏览器内核,这样就就比较大地避免了webview在使用过程中的适配问题,这里推荐使用由腾讯开发的x5浏览器内核。
相比于普通的手机自带浏览器内核,它有这样的优点:

   1) 速度快:相比系统webView的网页加载速度有近30%的提升。
   2) 省流量:云端优化技术使流量节省20%
   3) 更安全:24小时安全问题解决机制
   4) 更稳定:经过亿级用户的使用考验,CRASH率0.15%
   5) 集成强大的视频播放器,支持各种视频格式直接打开
   6) 适屏排版、字体设置等浏览增强功能的提供
   7) Html5更完整支持。
   8) 无系统内核的碎片化问题,更少的兼容性问题
目前所负责的项目就接入了x5的sdk,有一点比较吸引的是它能共享微信/手机QQ/空间的X5内核,使用起来更加便捷。

你可能感兴趣的:(Android WebView详解)