Android WebView 开发教程

时间:2021-09-04 22:59:56

声明在先:必须在AndroidMainfest.xml 里面声明权限,否则在Java里面编写的所有WebView浏览网页的代码都无法正常使用

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

1.WebView的使用

(a). 创建WebView的实例加入到Activity中

WebView webview = new WebView(this);
setContentView(webview);

或者在xml中配置WebView

<Webview
android:layout_width="match_parent"
android:layout_height="match_parent" >
</Webview>

(b). 访问网页

webview.loadUrl("https://www.baidu.com/");  

2.WebView API使用详解

(a). 请求加载网页部分

public void loadData (String data, String mimeType, String encoding)  

加载指定的data数据

参数说明:

data  字符串String形式的数据 可以通过base64编码而来

mineType data数据的 MIME类型, e.g. 'text/html'

encoding data数据的编码格式

注意:

1.Javascript有同源限制,同源策略限制了一个源中加载文本或者脚本与来自其他源中的数据交互方式。避免这种限制可以使用loadDataWithBaseURL()方法。

2.encoding参数制定data参数是否为base64或者 URL 编码,如果data是base64编码那么 encoding必须填写 "base64“。

public void loadDataWithBaseURL (String baseUrl, String data, String mimeType, String encoding, String historyUrl)  

使用baseUrl加载base URL的网页内容,baseUrl解决相关url使用Javascript相同源问题。

public void loadUrl (String url)  

加载制定url的网页内容

public void loadUrl (String url, Map<String, String> additionalHttpHeaders)  

加载制定url并携带http header数据。

public void reload ()  

重新加载页面  注意:页面所有资源会重新加载

 
public void stopLoading ()  

停止加载页面

(b). 网页的前进后退

public void goBack ()  // 页面后退
public void goForward () // 页面前进
public void goBackOrForward (int steps) // 以当前的index为起始点前进或者后退到历史记录中指定的steps, 如果steps为负数则为后退,正数则为前进
public boolean canGoForward () // 判断页面是否能够前进
public boolean canGoBack () // 判断页面是否能够后退

(c). JavaScript操作

public void addJavascriptInterface (Object object, String name)  

当网页需要和App进行交互时,可以注入Java对象提供给JavaScritp调用.  Java对象提供相应的方法供js使用.

注意:在Android 4.2以下使用这个api会涉及到JavaScript安全问题, javascript可以通过反射这个Java对象的相关类进行攻击。

链接:Android WebView 总结 —— Java和JavaScript交互

链接:Android 4.2版本以下使用WebView组件addJavascriptInterface方法存在JS漏洞

public void evaluateJavascript (String script, ValueCallback<String> resultCallback)  

这个方法在Android 4.4系统引入,因此只能在Android4.4系统中才能使用,提供在当前页面显示上下文中异步执行javascript代码

注意: 这个方法必须在UI线程调用,这个函数的回调也会在UI线程执行。那么在Android4.4一下如何执行javascrit代码呢?可以通过 WebView提供的loadUrl方法:具体格式如下:

webView.loadUrl("javascript:alert(injectedObject.toString())");  

其中javascript: 是执行javascript代码的标识 , 后面是javascript语句。

 
public void removeJavascriptInterface (String name)  

删除addJavascripInterface时对webview注入的java对象. 此方法在不同的Android系统WebView会有问题,会存在失效情况。

(d). 网页查找功能

public void findAllAsync (String find)  

异步执行查找网页内包含的字符并设置高亮,查找结果会回调.

public void findNext (boolean forward)  

查找下一个匹配的字符

(e). WebView 事件回调监听

public void setWebChromeClient (WebChromeClient client)  

主要通知客户端app加载当前网页的 title,Favicon,progress,javascript dialog等事件,通知客户端处理这些相应的事件。

 
public void setWebViewClient (WebViewClient client)  

主要通知客户端app加载当前网页时的各种时机状态,onPageStart,onPageFinish,onReceiveError等事件。

3.WebViewClient,WebChromeClient

WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情。比如说客户端需要显示网页加载的进度、网页加载发生错误等等事件。 WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承这两个类,接手相应事件处理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始加载onPageStarted,网页结束加载onPageFinished等;WebChromeClient主要提供网页加载过程中提供的数据内容,比如返回网页的title。

(a).WebViewClient

--WebViewClient使用

创建WebViewClient实例并设置到WebView对象中,具体代码参考如下:
webview.setWebViewClient(new WebViewClient () {
  @Override
public void onPageStarted(WebView view, String url, Bitmap favicon) {
// TODO
} @Override
public void onPageFinished(WebView view, String url) {
// TODO
}
});

--WebViewClient API详解

public boolean shouldOverrideUrlLoading(WebView view, String url)  

当加载的网页需要重定向的时候就会回调这个函数告知我们应用程序是否需要接管控制网页加载,如果应用程序接管,并且return true意味着程序接管网页加载,如果返回false让webview自己处理。

 
注意:
(1) 当请求的方式是"POST"方式时这个回调是不会通知的。
(2) 当我们访问的地址需要我们应用程序自己处理的时候,可以在这里截获,比如我们发现跳转到的是一个market的链接,那么我们可以直接跳转到应用市场,或者其他app。
 
public void onPageStarted(WebView view, String url, Bitmap favicon)  
当开始加载访问的url时,会通知应用程序,对每个main frame这个函数只会被调用一次,页面包含iframe 或者framesets 不会另外调用一次onPageStarted,当网页内内嵌的frame 发生改变时也不会调用onPageStarted。
注意: 当我们通过loadUrl的方式重新加载一个网址时候,这时候会先调用onPageStarted再调用shouldOverrideUrlLoading,当我们在打开的这个网址点击一个link,这时候会先调用shouldOverrideUrlLoading 再调用onPageStarted。不过shouldOverrideUrlLoading不一定每次都被调用,只有需要的时候才会被调用。
 
public void onPageFinished(WebView view, String url)  

当加载完当前页面时会通知我们的应用程序,这个函数只有在main frame情况下才会被调用。

public void onLoadResource(WebView view, String url)  

通知应用程序WebView即将加载url 制定的资源

 
public WebResourceResponse shouldInterceptRequest(WebView view, String url)  

通知应用程序内核即将加载url制定的资源,应用程序可以返回本地的资源提供给内核,若本地处理返回数据,内核不从网络上获取数据。

注意:这个回调并不一定在UI线程执行,所以我们需要注意在这里操作View或者私有数据相关的动作。如果我们需要改变网页的背景,或者需要实现网页页面颜色定制化的需求,可以在这个回调时机处理。
 
public void onReceivedError(WebView view, int errorCode,  String description, String failingUrl)  

当浏览器访问制定的网址发生错误时会通知我们应用程序,比如网络错误。

参数说明:
@param view 接收WebViewClient的那个实例,前面看到webView.setWebViewClient(new MyAndroidWebViewClient()),即是这个webview。

@param errorCode 错误号可以在WebViewClient.ERROR_* 里面找到对应的错误名称。

@param description 描述错误的信息
@param failingUrl  当前访问失败的url,注意并不一定是我们主url
 
注意:
在onReceiveError我们可以自定义网页的错误页面。
 
public void onFormResubmission(WebView view, Message dontResend, Message resend)  

如果浏览器需要重新发送POST请求,可以通过这个时机来处理。默认是不重新发送数据。

 
public void doUpdateVisitedHistory(WebView view, String url, boolean isReload)  
通知应用程序可以将当前的url存储在数据库中,意味着当前的访问url已经生效并被记录在内核当中。这个函数在网页加载过程中只会被调用一次。注意网页前进后退并不会回调这个函数。
 
public void onReceivedHttpAuthRequest(WebView view, HttpAuthHandler handler, String host, String realm)  
通知应用程序WebView接收到了一个Http auth的请求,应用程序可以使用supplied 设置webview的响应请求。默认行为是cancel 本次请求。
 
public boolean shouldOverrideKeyEvent(WebView view, KeyEvent event)   

提供应用程序同步一个处理按键事件的机会,菜单快捷键需要被过滤掉。如果返回true,webview不处理该事件,如果返回false, webview会一直处理这个事件,因此在view 链上没有一个父类可以响应到这个事件。默认行为是return false;

public void onScaleChanged(WebView view, float oldScale, float newScale)  
通知应用程序webview 要被scale。应用程序可以处理改事件,比如调整适配屏幕。
 

(b).WebChromeClient 

--webChromeClient使用

webView.setWebChromeClient(new WebChromeClient() {});

--webChromeCilent API详解

创建WebChromeClient实例并设置到WebView对象中,具体代码参考如下: 
public void onProgressChanged(WebView view, int newProgress)  

通知应用程序当前网页加载的进度。

 
public void onReceivedTitle(WebView view, String title)  

当document 的title变化时,会通知应用程序。注意:这个函数调用时机不确定,有可能很早,有可能很晚,取决于网页把title设置在什么位置,大多数网页一般把title设置到页面的前面,因此很多情况会比较早回调到这个函数。

 
public void onReceivedIcon(WebView view, Bitmap icon)  

当前页面有个新的favicon时候,会回调这个函数。

 
public void onShowCustomView(View view, CustomViewCallback callback)  

通知应用程序webview需要显示一个custom view,主要是用在视频全屏HTML5Video support。

参数说明:
@param view 即将要显示的view
@param callback  当view 需要dismiss 则使用这个对象进行回调通知。
 
public void onHideCustomView()  
退出视频通知
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg)  

请求创建一个新的窗口,如果我们应用程序接管这个请求,必须返回true,并且创建一个新的webview来承载主窗口。

如果应用程序不处理,则需要返回false,默认行为和返回false表现一样。
参数说明:
@param view 请求创建新窗口的webview
@param isUserGesture 如果是true,则说明是来自用户收拾操作行为,比如用户点击链接
@param isDialog true 请求创建的新窗口必须是个dialog,而不是全屏的窗口。
@param resultMsg 当webview创建时需要发送一个消息。WebView.WebViewTransport.setWebView(WebView)
 
public void onRequestFocus(WebView view)  

webview请求得到focus,发生这个主要是当前webview不是前台状态,是后台webview。

 
public void onCloseWindow(WebView window)  

通知应用程序从关闭传递过来的webview并从view tree中remove。

 
public boolean onJsAlert(WebView view, String url, String message, JsResult result)  

通知应用程序显示javascript alert对话框,如果应用程序返回true内核认为应用程序处理这个消息,返回false,内核自己处理。

注意:如果我们应用接管处理, 则必须给出result的结果,result.cancel,result.comfirm必须调用其中之后,否则内核会hang住。
 
public boolean onJsConfirm(WebView view, String url, String message,  JsResult result)  

通知应用程序提供confirm 对话框。

参数说明同上onJsAlert
 
public boolean onJsBeforeUnload(WebView view, String url, String message,  JsResult result)  

通知应用程序显示一个对话框,让用户选择是否离开当前页面,这个回调是javascript中的onbeforeunload事件,如果客户端返回true,内核会认为客户端提供对话框。默认行为是return false。

参数说明和之前介绍的onJsAlert()相同。
 
public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType, String capture)  

这个回调是私有回调, 当页面需要请求打开系统的文件选择器,则会回调这个方法,比如我们需要上传图片,请求拍照,邮件的附件上传等等操作。

如果不实现这个私有API,则上面的请求都将不会执行。
 

4.WebSettings

Android WebView提供展示网页,也提供我们应用程序对网页加载的一些定制,比如我们为了减少网络数据可以设置当前加载的页面不能显示图片。Android 提供管理WebView的一些setting的类WebSettings,在WebView对象被创建时WebSettings对象也会被同时创建,并附有默认的settings值. WebSettings对象可以通过WebView.getSettings()获得。WebSettings的生命周期同WebView生命周期相同,如果WebView被destroy 则WebSettings应该被释放,否则如果使用WebSettings继续再操作的话, 会抛出异常IllegalStateException。
 
注意:调用WebSettings设置的所有函数是异步制定的,因此我们设置某个状态并不能马上生效。
 

(a).WebSettings API详解

public synchronized void setLoadsImagesAutomatically(boolean flag)  

设置当前webview是否需要加载图片,这个标记控制整个webview的状态,并且对所有的资源都采取这种策略。如果设置为false 那么访问的当前网址中的所以图片资源将不会被加载。默认值是true;通过配置这个方法的标志,可以实现浏览器的无图模式和有图模式的控制。

 
public synchronized void setBlockNetworkImage (boolean flag)  

当getLoadsImagesAutomatically返回true这个方法才有效, 默认值为:false;

 
public void setCacheMode(int mode)  
一个普通网页的加载cache会被检查,内容也会被重新校验,第一次访问网页时,会存储cache到本地,设置策略可以让网页加载方式发生变化,cache模式有如下几种:
LOAD_DEFAULT: 如果我们应用程序没有设置任何cachemode, 这个是默认的cache方式。 加载一张网页会检查是否有cache,如果有并且没有过期则使用本地cache,否则从网络上获取。
LOAD_CACHE_ELSE_NETWORK: 使用cache资源,即使过期了也使用,如果没有cache才从网络上获取。
LOAD_NO_CACHE: 不使用cache 全部从网络上获取
LOAD_CACHE_ONLY:  只使用cache上的内容。
 
public synchronized void setLayoutAlgorithm(LayoutAlgorithm l) 

NORMAL:正常显示,没有渲染变化。 
SINGLE_COLUMN:把所有内容放到WebView组件等宽的一列中。   //这个是强制的,把网页都挤变形了(基本不推荐使用) 
NARROW_COLUMNS:可能的话,使所有列的宽度不超过屏幕宽度。 //默认的
TEXT_AUTOSIZING: 这个在API 19及之后才能使用,目前不需要了解和使用.

 
public void setLoadWithOverviewMode(boolean overview)  
概览模式的设置,默认指是false。
 
public synchronized void setJavaScriptEnabled (boolean flag)  

默认值是false.  如果我们网页需要javascript时,需要开启这个设置,否则网页加载不全。

 
 

5. WebView 使用 TIPS

(a).为WebView自定义错误显示界面:

覆写WebViewClient中的onReceivedError()方法:

 
/**
* 显示自定义错误提示页面,用一个View覆盖在WebView
*/
protected void showErrorPage() {
LinearLayout webParentView = (LinearLayout)mWebView.getParent(); initErrorPage();
while (webParentView.getChildCount() > 1) {
webParentView.removeViewAt(0);
}
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);
webParentView.addView(mErrorView, 0, lp);
mIsErrorPage = true;
}
protected void hideErrorPage() {
LinearLayout webParentView = (LinearLayout)mWebView.getParent(); mIsErrorPage = false;
while (webParentView.getChildCount() > 1) {
webParentView.removeViewAt(0);
}
} protected void initErrorPage() {
if (mErrorView == null) {
mErrorView = View.inflate(this, R.layout.online_error, null);
Button button = (Button)mErrorView.findViewById(R.id.online_error_btn_retry);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
mWebView.reload();
}
});
mErrorView.setOnClickListener(null);
}
} @Override
public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
  mErrorView.setVisibility(View.VISIBLE);
  super.onReceivedError(view, errorCode, description, failingUrl);
} =

(b).WebView cookies 清理

CookieSyncManager.createInstance(this);
CookieSyncManager.getInstance().startSync();
CookieManager.getInstance().removeSessionCookie();

(c).清理cache和历史记录

webView.clearCache(true);
webView.clearHistory();

(d).屏蔽长按事件

mWebView.setOnLongClickListener(new OnLongClickListener() {  

          @Override
public boolean onLongClick(View v) {
return true;
}
});

(e).Webview保留缩放功能,但是隐藏缩放控价

mWebView.getSettings().setSupportZoom(true);
mWebView.getSettings().setBuiltInZoomControls(true);
if (DeviceUtils.hasHoneycomb()) {
    mWebView.getSettings().setDisplayZoomControls(false);
}

注意:setDisplayZoomControls是在Android 3.0中新增的API. 

Android WebView 开发教程的更多相关文章

  1. android webview开发问题及优化汇总

    我们在native与网页相结合开发的过程中,难免会遇到关于WebView一些共通的问题.就我目前开发过程中遇到的问题以及最后得到的优化方案都将在这里列举出来.有些是老生常谈,有些则是个人摸索得出解决方 ...

  2. Android WebView 开发详解

    Android WebView 开发详解 参见 http://blog.csdn.net/typename/article/details/39030091

  3. Android WiFi开发教程(一)——WiFi热点的创建与关闭

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...

  4. Android蓝牙开发教程(三)——蓝牙设备相互通讯

    在上一篇中已经介绍如何连接我们搜索到的蓝牙设备,如果你还没阅读过,建议先看看上一篇文章Android蓝牙开发教程(二)——连接蓝牙设备 在上一篇文章中,无论是自动连接还是被动连接,连接成功后,都是将获 ...

  5. Android WiFi开发教程(三)——WiFi热点数据传输

    在上一篇文章中介绍了WiFi的搜索和连接,如果你还没阅读过,建议先阅读上一篇Android WiFi开发教程(二)——WiFi的搜索和连接.本篇接着简单介绍手机上如何通过WiFi热点进行数据传输. 跟 ...

  6. Android WiFi开发教程(二)——WiFi的搜索和连接

    在上一篇中我们介绍了WiFi热点的创建和关闭,如果你还没阅读过,建议先阅读上一篇文章Android WiFi开发教程(一)——WiFi热点的创建与关闭. 本章节主要继续介绍WiFi的搜索和连接. Wi ...

  7. Android WebView 开发详解&lpar;一&rpar;

    转载请注明出处  http://blog.csdn.net/typename/article/details/39030091 powered by meichal zhao 概览: Android ...

  8. &lbrack;小程序开发&rsqb; 微信小程序内嵌网页web-view开发教程

    为了便于开发者灵活配置小程序,微信小程序开放了内嵌网页能力.这意味着小程序的内容不再局限于pages和large,我们可以借助内嵌网页丰富小程序的内容.下面附上详细的开发教程(含视频操作以及注意事项) ...

  9. Android WebView 开发详解&lpar;三&rpar;

    转载请注明出处   http://blog.csdn.net/typename/article/details/40302351 powered by miechal zhao 概览 Android ...

随机推荐

  1. node&period;js自动化测试断言包assert的方法说明

    参考以下文档 http://yijiebuyi.com/blog/ca2c0edf447624bd4d527490c9fce369.html http://www.cnblogs.com/softlo ...

  2. C&num;操作XML文档---基础

    增查改删代码如下 public void CreateXML() { XmlDocument xml = new XmlDocument(); xml.AppendChild(xml.CreateXm ...

  3. leetcode8 String to Integer &lpar;atoi&rpar;

    题目需求: 输入一个字符串,输出对应的int值 特殊处理: 输入: null  输出:0 输入: "a122"  输出:0 输入: "   1233"  输出: ...

  4. win7下配置IIS服务器方法

    网站爱好初学者必看的win7系统配置自己的IIS,可以在你自己的电脑上配置网站服务器发不到网上,下面就跟着我的步骤一起做吧100%成功. 步骤方法 1.点击开始-------控制面板这个就是打开的控制 ...

  5. Objective-C之成魔之路【9-类构造方法和成员变量作用域、以及变量】

    郝萌主倾心贡献,尊重作者的劳动成果.请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 构造方法 ...

  6. 外网访问本地服务器下的web应用

    让本地服务器可以在外网访问的方式有很多,介绍其中一种: 由于本人是在自己电脑上装了一个虚拟机, 测试环境为:虚拟机作为服务器,服务器中装了一个禅道,虚拟机IP192.168.2.221,本人通过tpl ...

  7. Java基本语法-----java运算符的优先级与结合性

    这是本人以前的上学期间java 运算符这块知识的总结的,截图存到了word里,大家将就看下吧(不会用Markdown的表格 不然就在写一遍了 T T). [正在看本人博客的这位童鞋,我看你气度不凡,谈 ...

  8. WCF和委托

         WCF各个模块的联系: Contracts:一个类库项目,定义服务契约(Service Contract),引用System.ServiceMode程序集(WCF框架的绝大部分实现和API定 ...

  9. 编译wxWidgets

    打开x64 Native Tools Command Prompt for VS 2017 cd wxWidgets-2.9.5\build\msw nmake -f makefile.vc TARG ...

  10. Linux服务安装配置总结