欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android程序开发之WebView使用总结

程序员文章站 2024-03-05 08:12:24
前言: 今天修改项目中一个有关webview使用的bug,激起了我总结webview的动机,今天抽空做个总结。 使用场景: 1.)添加权限...

前言:

今天修改项目中一个有关webview使用的bug,激起了我总结webview的动机,今天抽空做个总结。

使用场景:

1.)添加权限

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

2.)布局文件

<webview
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />

3.)数据加载

加载本地资源

webview.loadurl("file:///android_asset/example.html");

加载网络资源

webview.loadurl("www.xxx.com/index.html");

添加请求头信息

map<string,string> map=new hashmap<string,string>();map.put("user-agent","android");
webview.loadurl("www.xxx.com/index.html",map);

也可以加载html片段

string data = " html 数据";
webview.loaddata(data, "text/html", "utf-8");

实测会发现loaddata会导致中文乱码,所以一般情况使用如下代码

string data = " html 数据";
webview.loaddatawithbaseurl(null,data, "text/html", "utf-8",null);

4.)支持javascript

比如项目总js触发一个native函数关闭activity

设置支持javascript

websettings websettings = webview.getsettings();
websettings.setjavascriptenabled(true);//设置支持javascript
webview.addjavascriptinterface(new javascriptinterface(), "xueleapp"); javascriptinterface 接口定义 
public class javascriptinterface {
@android.webkit.javascriptinterface
public void dotrainfinish() {
finish();
}
}

5.)设置webviewclient 主要辅助webview处理各种通知、请求事件

比如要实现webview中链接在webview内部跳转

webview.setwebviewclient(new webviewclient() {
public boolean shouldoverrideurlloading(webview view, string url) {
view.loadurl(url);
return true;
}
});

除此之外webviewclient更多的处理网页的地址的解析和渲染,例如

onloadresource//加载资源时响应
  onpagestart//在加载页面时响应
  onpagefinish//在加载页面结束时响应
  onreceiveerror//在加载出错时响应
  onreceivedhttpauthrequest//获取返回信息授权请求

6.)设置webchromeclient主要辅助webview处理javascript的对话框,网站图标,网站title,加载进度等

比如加载进度获取title

webview.setwebchromeclient(new webchromeclient() {
@override
public void onprogresschanged(webview view, int newprogress) {
if (newprogress == 100) {
//网页加载完成
} else {
//网页加载中
}
}
});

除了上面检测进度之外还有

  onclosewindow//关闭webview
  oncreatewindow() //触发创建一个新的窗口
  onjsalert //触发弹出一个对话框
  onjsprompt //触发弹出一个提示
  onjsconfirm//触发弹出确认提示
  onprogresschanged //加载进度
  onreceivedicon //获取网页icon
  onreceivedtitle//获取网页title

7.)设置网页栈返回

webview会默认把浏览过去的网页进行压栈存储,所以我们有时需要实现回退到上一目录

@override
public boolean onkeydown(int keycode, keyevent event) {
if (keycode == keyevent.keycode_back) {
if (webview.cangoback()) {
webview.goback();//返回上一浏览页面
return true;
} else {
finish();//关闭activity
}
}
return super.onkeydown(keycode, event);
}

8.)webview 缓存控制

•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,都使用缓存中的数据。

websettings websettings = webview.getsettings();
websettings.setcachemode(websettings.load_cache_else_network);

9.)webview屏幕自适应

websettings websettings = webview.getsettings();
websettings.setusewideviewport(true);
websettings.setloadwithoverviewmode(true);

10.)其他不常用设置

websettings websettings = webview.getsettings();
websettings.setsupportzoom(true); //支持缩放
websettings.setlayoutalgorithm(websettings.layoutalgorithm.single_column); //支持内容重新布局
websettings.supportmultiplewindows(); //多窗口
websettings.setallowfileaccess(true); //设置可以访问文件
websettings.setneedinitialfocus(true); //当webview调用requestfocus时为webview设置节点
websettings.setbuiltinzoomcontrols(true); //设置支持缩放
websettings.setjavascriptcanopenwindowsautomatically(true); //支持通过js打开新窗口
websettings.setloadsimagesautomatically(true); //支持自动加载图片

11.)知识扩展webviewjsbridge

虽然谷歌也提供了js与native函数互相调用的方式,但是通过addjavascriptinterface这种方式在android 4.2以下版本存在一定的安全隐患,在android 4.2以上也需要加@javascriptinterface注解,否则无法调用。基于上面的原因建议学习一下

webviewjsbridge这个比较不错的开源框架,地址:https://github.com/firewolf-ljw/webviewjsbridge

12.)硬件加速

开启硬件加速强制使用gpu渲染,确实给app流畅度带来不小的提升,但是在使用过程中遇见webview闪烁,也有导致加载webview黑屏或者白屏

解决办法:关闭硬件加速

webview.setlayertype(view.layer_type_software, null);

这是把webview 中的硬件加速关闭。设置layer_type_software后会把当前view转为bitmap保存。这样就不能开多个webview,否则会报out of memory。

需要在在webview中加入如下代码

protected void onmeasure(int widthmeasurespec, int heightmeasurespec) {
invalidate();
super.onmeasure(widthmeasurespec, heightmeasurespec);
}

以上所述是小编给大家介绍的android程序开发之webview使用总结,希望对大家有所帮助