android webview的使用

来源:互联网 发布:python自动化测试虫师 编辑:程序博客网 时间:2024/06/07 06:42

最近因公司需要使用了webview来加载网页。使用后我觉得有必要将注意点记录下来,以备不时之需。

首先:在对应活动中的xml里使用webview,在活动中得到webview的实例并加载url:webview.loadurl(url);这样运行出来过后就能看见你加载url的内容了,实际上webview加载数据大致分为几种:

1. 加载本地资源:webView.loadUrl("file:///android_asset/example.html");

2. 加载网络资源:webView.loadUrl("www.xxx.com/index.html");

3. 添加请求头信息:

Map<String,String> map=new HashMap<String,String>();
map.put("User-Agent","Android");
webView.loadUrl("www.xxx.com/index.html",map);

4.也可以加载html片段: String data = " Html 数据";webView.loadData(data, "text/html", "utf-8"); 


webview的常用设置:

1.支持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();
        }

    }
2.设置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//获取返回信息授权请求

  3.设置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

其中在webview中点击上传图标弹出弹出框选择图片和拍照上传时,android5.0以上和以下的触发条件是不一样的。

 4.)设置网页栈返回
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);    }
5.)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);
6.)WebView屏幕自适应
WebSettings webSettings = webView.getSettings(); webSettings.setUseWideViewPort(true); webSettings.setLoadWithOverviewMode(true);
 7.)其他不常用设置
 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);//支持自动加载图片
8.)硬件加速

 开启硬件加速强制使用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);    }
9.)知识扩展WebViewJSBridge

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

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

10.解决webview不可见或者退出时正在播放的视频未停止:
 @Override    protected void onPause() {        super.onPause();        webview.onPause();        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {            webview.onPause(); // 暂停网页中正在播放的视频        }    }
    @Override    protected void onResume() {        super.onResume();        webview.onResume();    }
本次总结和学习主要参考了:http://www.cnblogs.com/whoislcj/p/5645025.html,感谢原作者的成果。
 
原创粉丝点击