稻草人总结之WebView的介绍

来源:互联网 发布:手机ui界面设计软件 编辑:程序博客网 时间:2024/05/22 06:29
  1. 因为要访问网络,所以manifest中必须要加uses-permission:

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

WebView

WebView是一个基于webkit引擎、展现web页面的控件

 WebView 是一个可以显示网页的控件,他的网页渲染引擎和Safari、Chrome一样都是Webkit(一个开源的浏览器引擎)

作用:

•显示和渲染Web页面
•直接使用html文件(网络上或本地assets中)作布局
•可和JavaScript交互调用

 

1.1 优势:使用WebView来开发应用,有几个很明显的优势:

1、搭建Java和Javascript之间交互的桥梁。

2、跨平台,网页代码编写一次,即可以在任何支持web的平台上运行,如adnroid  iphone  win节省开发成本,提高开发效率。

3、资源利用最大化,web开发人员只用很少的学习成本即可以使用WebView开发。

 4、应用程序维护成本大大降低,只用维护服务器端代码即可

1.2WebView的使用

WebView加载页面
1:LoadUrl(String url);直接加载网页、图片并显示(互联网用)
如果是在assets 目录下:地址为file:///android_asset/jstest.html
(本地用)
2:有时候我们的webview可能只是html片段,而不是一个完整的网页,事实上绝大多数时候都是如此,完整的网页无需做成应用,而直接在浏览器访问。
这种情况我们使用 LoadData 或者 loadDataWithBaseURL方法,后者用的最多:
*loadData(String data, String mimeType, String encoding):data 为 html 代码内容
:mWebView.loadData(data, "text/html;charset=utf-8", null);
*webView.loadDataWithBaseURL():直接加载本地信息

loadDataWithBaseURL()比loadData()多两个参数,可以指定HTML代码片段中相关资源的相对根路径,也可以指定历史Url,其余三个参数相同

mWebView.loadDataWithBaseURL(“http://www.jcodecraeer.com", body, "text/html", “utf-8",null);


1.3Webview的最常用的子类

(WebSettings类、WebViewClient类、WebChromeClient类)

WebSettings

用来对WebView做各种设置, 你可以这样获取WebSettings

js处理

  • setJavaScriptEnabled(true); //支持js
  • setPluginsEnabled(true); //支持插件
  • setJavaScriptCanOpenWindowsAutomatically(true); //支持通过JS打开新窗口

缩放处理

  • setUseWideViewPort(true); //将图片调整到适合webview的大小
  • setLoadWithOverviewMode(true); // 缩放至屏幕的大小
  • setSupportZoom(true); //支持缩放,默认为true。是下面那个的前提。
  • setBuiltInZoomControls(true); //设置内置的缩放控件。 这个取决于setSupportZoom(), 若setSupportZoom(false),则该WebView不可缩放,这个不管设置什么都不能缩放。
  • setDisplayZoomControls(false); //隐藏原生的缩放控件

内容布局

  • setLayoutAlgorithm(LayoutAlgorithm.SINGLE_COLUMN); //支持内容重新布局
  • supportMultipleWindows(); //多窗口
  • .stopLoading()停止加载页面

文件缓存

  • setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK); //关闭webview中缓存
  • setAllowFileAccess(true); //设置可以访问文件
  • setNeedInitialFocus(true); //当webview调用requestFocus时为webview设置节点
  • 除了当前访问记录.clearFormData () //这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据。
  • clearHistory ();//清除当前webview访问的历史记录,只会webview访问历史记录里的所有记录clearCache(true);//清除网页访问留下的缓存,由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序

其他

  • setLoadsImagesAutomatically(true); //支持自动加载图片
  • setDefaultTextEncodingName(“utf-8”); //设置编码格式
  • setPluginState(PluginState.OFF); //设置是否支持flash插件
  • setDefaultFontSize(20); //设置默认字体大小
  • goBcak canGoBack goForward canGoForward//设置后退,前进

WebViewClient

主要帮助WebView处理各种通知、请求事件(例如,点击链接时候如何显示界面,页面开始加载,加载完毕之后有何动作等)

webView.setWebViewClient(new WebViewClient() { @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 onReceivedError(WebView view, int errorCode, String description, String failingUrl) { super.onReceivedError(view, errorCode, description, failingUrl); // 这里进行无网络或错误处理,具体可以根据errorCode的值进行判断, } @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { view.loadUrl(url); //在当前的webview跳转到新连接,可以进行网页拦截2.调用系统浏览器跳转到新网页 Intent i = new Intent(Intent.ACTION_VIEW); i.setData(Uri.parse(url));  startActivity(i); return true;}}

WebChromeClient

辅助WebView处理Javascript的对话框、网站图标、网站Title、加载进度等

webView.setWebChromeClient(new WebChromeClient() { @Override public void onProgressChanged(WebView view, int newProgress) { // 获得网页的加载进度 newProgress为当前加载百分比 super.onProgressChanged(view, newProgress); if (newProgress < 100) {              String progress = newProgress + "%";              progress.setText(progress);            } else {        }} @Override public void onReceivedTitle(WebView view, String title) { // 获取网页的title,客户端可以在这里动态修改页面的title // 另外,当加载错误时title为“找不到该网页” super.onReceivedTitle(view, title); titleview.setText(title);} });

常见用法:设置WebView缓存

//优先使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//缓存模式如下:
//LOAD_CACHE_ONLY: 不使用网络,只读取本地缓存数据
//LOAD_DEFAULT: (默认)根据cache-control决定是否从网络上取数据。
//LOAD_NO_CACHE: 不使用缓存,只从网络获取数据.
//LOAD_CACHE_ELSE_NETWORK,只要本地有,无论是否过期,或者no-cache,都使用缓存中的数据。
//不使用缓存:
WebView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);

清除缓存数据

/清除网页访问留下的缓存
//由于内核缓存是全局的因此这个方法不仅仅针对webview而是针对整个应用程序.
Webview.clearCache(true);

//清除当前webview访问的历史记录
//只会webview访问历史记录里的所有记录除了当前访问记录
Webview.clearHistory();

//这个api仅仅清除自动完成填充的表单数据,并不会清除WebView存储到本地的数据
Webview.clearFormData();



常见用法:Back键控制网页后退

webview是否可以返回到上一页面 webView.canGoBack()
•webview返回到上一页面 webView.goBack();
•webview是否可以前进 webView.canGoForward()
•webview前进 webView.goForward();
//以当前的index为起始点前进或者后退到历史记录中指定的steps
//如果steps为负数则为后退,正数则为前进
webview.goBackOrForward(intsteps)


问题:在不做任何处理前提下 ,浏览网页时点击系统的“Back”键,整个 Browser 会调用 finish()而结束自身
•目标:点击返回后,是网页回退而不是退出浏览器
•解决方案:在当前Activity中处理并消费掉该 Back 事件

public boolean onKeyDown(int keyCode, KeyEvent event) {    if ((keyCode == KEYCODE_BACK) && mWebView.canGoBack()) {         mWebView.goBack();        return true;    }    return super.onKeyDown(keyCode, event);}

如何避免WebView内存泄露?

//在 Activity 销毁( WebView )的时候,先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空。@Override    protected void onDestroy() {        if (mWebView != null) {            mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);            mWebView.clearHistory();            ((ViewGroup) mWebView.getParent()).removeView(mWebView);            mWebView.destroy();            mWebView = null;        }        super.onDestroy();    }

一。WebView里,JS调用Java

webView.addJavascriptInterface(Object obj, String interfaceName)//
把java类注册成javascript对象,以便调用;参数一:要调用的对象,参数二:x需要被js调用的对外接口名

在Android4.0以后版本需要添加
@android.webkit.JavascriptInterface

mWebView.addJavascriptInterface(new JSInterface(), "jsInterface");JSInterface对象:public class JSInterface {@JavascriptInterfacepublic void methodA() {}@JavascriptInterfacepublic void methodB(String webMessage) {}}


在javaScript中如果调用java的方法,需要写这样的代码
javascript:window.javaCode.toast(uname);

//javaCode是对象名,toast是对象要调用的方法

二。WebView里,Java调用JS

webView.loadUrl("javascript:js函数名 ")

确保当前已经加载html页面,然后用该方法




原创粉丝点击