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

android基础开发之WebView的更多相关文章

  1. Android安全开发之WebView中的地雷

    Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...

  2. android软件开发之webView.addJavascriptInterface循环渐进【一】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  3. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  4. Android混合开发之WebView使用总结

    前言: 今天修改项目中一个有关WebView使用的bug,激起了我总结WebView的动机,今天抽空做个总结. 混合开发相关博客: Android混合开发之WebView使用总结 Android混合开 ...

  5. android软件开发之webView.addJavascriptInterface循环渐进【二】

    本篇文章由:http://www.sollyu.com/android-software-development-webview-addjavascriptinterface-cycle-of-gra ...

  6. Android安全开发之WebView中的大坑

    0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者简单的展示一些在线内容等.WebView功能强大 ...

  7. android基础开发之RecycleView(1)---基本使用方式

    RecycleView是google为了优化listview,gridview 提供的一个新的控件. 1.android 导入recycleview 在app的gradle里面加入: dependen ...

  8. android基础开发之scrollview

    scrollView 是android系统提供的一种 特殊的展示view. 其实我们很早就遇到过scrollview的东东,比如listview. 而google官方文档也提出,不要混合使用scrol ...

  9. Android混合开发之WebViewJavascriptBridge实现JS与java安全交互

    前言: 为了加快开发效率,目前公司一些功能使用H5开发,这里难免会用到Js与Java函数互相调用的问题,这个Android是提供了原生支持的,不过存在安全隐患,今天我们来学习一种安全方式来满足Js与j ...

随机推荐

  1. 流行趋势:25款很酷的长阴影效果 LOGO 设计

    长阴影其实就是扩展了对象的投影,感觉是一种光线照射下的影子,通常采用角度为 45 度的投影,给对象添加了一份立体感.长阴影(Long Shadow)概念来自于最新非常流行的扁平化设计(Flat Des ...

  2. Swift_3.0_开启注释功能

    1. Swift_3.0 没法快捷键(command+/)注释的原因:这个是因为苹果解决xcode ghost,把插件屏蔽了. 2. 解决办法: (1) 终端输入: sudo /usr/libexec ...

  3. Android 学习笔记之如何实现简单相机功能

    PS:看来算法和数据结构还是非常有用的,以后每天都练习两道算法题目...这次忘了对代码进行折叠了..导致篇幅过长... 学习内容: 1.Android如何实现相机功能... 2.如何实现音频的录制.. ...

  4. Android注解编程的第一步---模仿ButterKnife的ViewBinder机制

    ButterKnife的使用极大方便了Android程序员的开发,实际上,我们可以自己模仿一下实现. 首先就是要了解Java注解的使用. 我们首先要声明一个@interface,也就是注解类: @Ta ...

  5. .NET C# 使用S22.Imap.dll接收邮件 并且指定收取的文件夹的未读邮件,并且更改未读准态

    string host = Conf.ConfigInfo.POP_Host; int port = Conf.ConfigInfo.POP_Port; string username =Conf.C ...

  6. QCustomplot使用分享(六) 坐标轴和网格线

    一.概述 前边已经写了5篇对QCustomPlot的讲解,看过上述的几篇文章后,基本就能做一些简单的使用了,但是如果想要做到高度的控制图表,那么坐标轴将是很重要的一部分,因为坐标轴就是图表的一个参考系 ...

  7. Dev TreeList设置焦点失败解决方法

    问题描述 对TreeList初始化之后,设置treelist的焦点节点时,发现每次初始化控件的时不能正确的绑定焦点节点,第二次点开treelist的时候才会正常的设置目标节点为焦点节点. 截图 解决方 ...

  8. dictionary 添加数据

    var empList = from p in customers select new { p.Personnel_ID, p.PersonName }; var empTempList = emp ...

  9. tomcat+webservice实现简单的web服务远程调用接口

    1,准备工作:    ①需要使用到jaxws的一系列架包,网址:http://jax-ws.java.net,我下的是比较新的一个版本(下载好以后吧架包发在lib下),②webservice的一个工具 ...

  10. spring boot学习笔记

    spring boot 是什么 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程. spring boot采用了“约定优于配置” ...