Android混合开发教程之WebView的使用方法总结

作者:总李写代码 时间:2023-03-11 21:27:03 

前言:

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

简介

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

Android的Webview在低版本和高版本采用了不同的webkit版本内核,4.4后直接使用了Chrome。

作用

  • 显示和渲染Web页面

  • 直接使用html文件(网络上或本地assets中)作布局

  • 可和JavaScript交互调用

WebView控件功能强大,除了具有一般View的属性和设置外,还可以对url请求、页面加载、渲染、页面交互进行强大的处理。

Android混合开发教程之WebView的使用方法总结

混合开发相关博客:

  • Android混合开发之WebView使用总结

  • Android混合开发之WebView与Javascript交互

使用场景:

 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);
}

 

干我们这行,啥时候懈怠,就意味着长进的停止,长进的停止就意味着被淘汰,只能往前冲,直到凤凰涅槃的一天!

来源:http://www.cnblogs.com/whoislcj/p/5645025.html

标签:android,webview,混合开发
0
投稿

猜你喜欢

  • android客户端从服务器端获取json数据并解析的实现代码

    2023-09-30 07:52:20
  • SpringBoot项目打成war和jar的区别说明

    2023-10-05 04:54:15
  • java使用websocket,并且获取HttpSession 源码分析(推荐)

    2023-08-04 17:38:05
  • java编程创建型设计模式单例模式的七种示例

    2023-06-21 08:47:39
  • Kotlin + Flow 实现Android 应用初始化任务启动库

    2023-05-23 12:58:28
  • C#将Sql数据保存到Excel文件中的方法

    2023-11-11 08:34:26
  • Flutter之Timer实现短信验证码获取60s倒计时功能的代码

    2023-07-20 20:00:30
  • QT实现用户登录注册

    2022-07-10 08:21:57
  • 15个顶级Java多线程面试题(附答案)

    2023-11-24 01:53:44
  • C#使用GET、POST请求获取结果

    2023-04-20 13:35:43
  • C#中事件处理的个人体会

    2023-11-02 02:14:39
  • 23种设计模式(7) java代理模式

    2023-01-28 21:57:20
  • Android如何禁止向EditText控件中输入内容详解

    2021-07-29 05:01:11
  • Android App使用RecyclerView实现上拉和下拉刷新的方法

    2023-03-28 17:47:20
  • Android SearchView搜索框组件的使用方法

    2023-06-25 08:13:42
  • DevExpress TreeList 常见问题解决方法

    2022-07-15 18:16:54
  • Android使用RecyclerView实现水平滚动控件

    2021-09-10 20:17:54
  • C#基于Sockets类实现TCP通讯

    2023-03-22 05:08:30
  • Java泛型<T> T与T的使用方法详解

    2021-07-12 10:58:42
  • 详解SpringMVC如何进行数据回显

    2023-09-12 08:48:15
  • asp之家 软件编程 m.aspxhome.com