zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    ValueStack、ActionContext
    s debug
    1923: [Sdoi2010]外星千足虫
    1013: [JSOI2008]球形空间产生器sphere
    HDU 3923 Invoker
    poj 1286 Necklace of Beads
    HDU 3037:Saving Beans
    2440: [中山市选2011]完全平方数
    1101: [POI2007]Zap
    1968: [Ahoi2005]COMMON 约数研究
  • 原文地址:https://www.cnblogs.com/deman/p/5282159.html
Copyright © 2011-2022 走看看