android基础开发之WebView

WebView 是android平台沟通 http & H5 页面的桥梁。

但是google对这块的表述不是很清晰,而且SDK里面基本看不到源码,只有一个接口而已。

传送:http://developer.android.com/intl/zh-cn/guide/webapps/index.html

WebView是Android系统提供能显示网页的系统控件,它是一个特殊的View,同时它也是一个ViewGroup可以有很多其他子View。在Android 4.4以下(不包含4.4)系统WebView底层实现是采用WebKit(http://www.webkit.org/)内核,而在Android 4.4及其以上Google 采用了chromium(http://www.chromium.org/)作为系统WebView的底层内核支持。在这一变化中Android 提供的WebView相关API并没有发生大变化,在4.4上也兼容低版本的API并且引进了少部分API。这里简单介绍下基于Chromium 的Webview和基于Webkit webview的差异,基于Chromium Webview提供更广的HTML5,CSS3,Javascript支持,在目前最新Android 系统版本5.0上基于chromium 37,Webview提供绝大多数的HTML5特性支持。Webkit JavaScript引起采用WebCore Javascript 在Android 4.4上换成了V8能直接提升JavaScript性能。另外Chromium 支持远程调试(Chrome DevTools)。

1.webview的使用:

<?xml version="1.0" encoding="utf-8"?>
<WebView xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/wv_demo">

</WebView>

webview就跟一个普通的view一样放在布局里面就可以。

需要权限

<uses-permission android:name="android.permission.INTERNET" />

2.两个重要的client:

WebChromeClient:主要处理本地交互,比如进度条,title等。

WebViewClient:主要处理网页内部交互,比如页面重载,页面加载开始,结束回调等。

 WebChromeClient webChromeClient = new WebChromeClient(){
        @Override
        public View getVideoLoadingProgressView() {
            return super.getVideoLoadingProgressView();
        }

        @Override
        public void onProgressChanged(WebView view, int newProgress) {
            super.onProgressChanged(view, newProgress);
            if(newProgress <100)
            {
                mViewController.showLoading();
            }
            else
            {
                mViewController.closeLoading();
            }
        }

        @Override
        public void onReceivedTitle(WebView view, String title) {
            super.onReceivedTitle(view, title);
        }

        @Override
        public void onShowCustomView(View view, CustomViewCallback callback) {
            super.onShowCustomView(view, callback);
        }

        @Override
        public void onHideCustomView() {
            super.onHideCustomView();
        }
    };
WebViewClient webViewClient = new WebViewClient(){

        /**
         * the most important API for H5 & app to connect
         * @param view view
         * @param url  url
         * @return     true. doing with url. false,pass the event.
         */
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return super.shouldOverrideUrlLoading(view, url);
        }

        @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);
            if(url.contains("abcxxx.html"))
            {
                /*it must be here, can clear last one in history*/
                mViewController.clearHistory();
            }
        }

        @Override
        public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
            super.onReceivedError(view, request, error);
        }
    };
shouldOverrideUrlLoading()的方法其实很重要,如果我们需要处理url,就需要返回true,一般的写法就是在这里更具url的处理逻辑:

if (Uri.parse(url).getHost().equals("www.baidu.com")) {
        view.loadUrl(url);
        return true;
    }else{
        //doSomething..
}

3.webview & Js 

webview 支持js回调。

具体使用方法如下:

mWebView.addJavascriptInterface(mPresenter.getJsCallback(), mPresenter.JsInterfaceName());
@Override
public JsPresenterInterface getJsCallback() {
return new JsPresenterInterface(context);
}

public String JsInterfaceName() {
return "demo";
}
JsPresenterInterface只是一个普通的类即可。
public class JsPresenterInterface {

    private Context context;
    public JsPresenterInterface(Context context)
    {
        this.context = context;
    }

    @JavascriptInterface
    public String version()
    {
        String versionName = null;
        PackageManager pm = context.getPackageManager();
        try {
            PackageInfo info = pm.getPackageInfo(context.getPackageName(),0);
            versionName = info.versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }

        return versionName;
    }
}

所以js中调用的代码就是:window.demo.version!

4.webview 的回退

webview 可以自带回退功能,就是页面的浏览历史,所以可以在backkey的处理中,加上webview的特殊处理。

    @Override
    public void onBackPressed() {
        if (mWebView.canGoBack()) {
            mWebView.goBack();
            mPresenter.onBackClick();
        } else {
            super.onBackPressed();
        }
    }

有时候我们不想保留历史,直接退出页面,可以使用:

    @Override
    public void clearHistory() {
        mWebView.clearHistory();
    }

注意该方法 必须在以下方法中设置,才能清空last page。

WebViewClient webViewClient = new WebViewClient(){

        。。。

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            if(url.contains("abcxxx.html"))
            {
                /*it must be here, can clear last one in history*/
                mViewController.clearHistory();
            }
        }    

5.cookie的使用:

    @Override
    @SuppressWarnings("all")
    public void setCookie() {
        URI uri = URI.create(model.getUrl());
        if (TextUtils.isEmpty(uri.getHost())) {
            return;
        }

        if (Build.VERSION.SDK_INT <= 20) {
            CookieSyncManager.createInstance(context);
        }

        CookieManager cm = CookieManager.getInstance();
        cm.setAcceptCookie(true);
        cm.removeSessionCookies(null);
        cm.setCookie(model.getUrl(),new String("cookievalue"));

        if (Build.VERSION.SDK_INT >= 21) {
            cm.flush();
        } else {
            CookieSyncManager.getInstance().sync();
        }
    }
        //判断系统版本是不是5.0或之上
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP){
            //让系统不屏蔽混合内容和第三方Cookie
            CookieManager.getInstance().setAcceptThirdPartyCookies(wvBrowser, true);
            webviewSettings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }

6.页面缓存:

mSettings.setCacheMode(WebSettings.LOAD_DEFAULT);

本地缓存方式。

LOAD_CACHE_ONLY:  不使用网络,只读取本地缓存数据
LOAD_DEFAULT:  根据cache-control决定是否从网络上取数据。
LOAD_CACHE_NORMAL: API level 17中已经废弃, 从API level 11开始作用同LOAD_DEFAULT模式
LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。

H5页面内部缓存:

mSettings.setAppCacheEnabled(true);

以上就是webview常用到的功能。

参考:

http://developer.android.com/intl/zh-cn/guide/webapps/index.html

http://blog.csdn.net/typename/article/details/40425275

原文地址:https://www.cnblogs.com/deman/p/5282159.html