混合式开发收藏本版 +发表新主题

WebView使用大全

一、简介
WebView是一个用来显示web网页的控件,继承自AbsoluteLayout。
在android4.4之前使用的是WebKit作为渲染内核,4.4之后采用Chrome内核

二、基本方法
常用方法:
void loadUrl(String url)                加载网页链接
boolean canGoBack()                判断WebView当前是否可以返回上一页
goBack()                                        回退到上一页
boolean canGoForward                判断是否可以向前一页
goForward()                                到前一页
onPause()                                类似activity的生命周期,页面进入后台后不可见
pauseTimers()                                该方法面向全局整个应用的webview,会暂停所有的webview。当进入后台时,调用该方法可以降低CPU功耗
onResume()                                调用onParse()之后可以调用此方法来恢复WebView的运行
resumeTimers()                        恢复parseTimers的所有猜错(两者必须要搭配使用)
destory()                                        销毁Webview
claerHistory()                                清除历史记录
laerCache(boolean includeDiskFiles)        清空网页访问的缓存数据。由于缓存是全局的,所以只要是WebView的缓存都会被清除。通过所传的参数可以选择是否清除磁盘缓存
reload()                                        重新加载当前请求
setLayerType(int layType, Paint paint)        设置硬件加速、软件加速
removeAllView()                        清除所有的子view
claerSslPreferences()                清除Ssl信息
claerMatches()                        清除网页查找的高亮匹配字符
removeJavascriptInterface(String interface)        删除interfaceName对应的注入js对象
addJavascriptInterface(Object object, String interfaceName)        注入java对象

setVerticalScrollBarEnabled(boolean verticalScrollBarEnabled)
                                设置垂直方向的滚动条是否显示
setHorizontalScrillBarEnabled(boolean horizontalScrollBarEnabled)
                                设置水平方向的滚动条是否显示
loadUrl(String url, Map<String, String> additionalHttpHeaders)
                                加载定制的url并携带http请求头
evaluateJavascript(String script, ValueCallBack<String> resultCallBack)
                                API19后可采用此方法执行js
stopLoading()                                停止WebView当前加载
clearView()                                清空当前加载。此方法已经被遗弃,官方建议使用loadUrl("about:blank")来实现
freeMemory()                                释放内存
clearFromDate()                        清除自动填充的表单数据,并不会清除WebView存储到本地的数据
注意:
onParse()                不会暂停JavaScript,想要全局的暂停JavaScript可以使用pauseTimers

三、常用的属性
WebSettings、WebViewClient、WebChromeClient
         WebSettings:

                                setJavaScriptEnabled(boolean flag)                是否支持js
                                setCacheMode(int Mode)                                        设置view的缓存模式
                                setAppCacheEnabled(boolean flag)                是否启用缓存模式
                                setAppCachePath(String appCachePath)        Android私有缓存存储,如果不调用此方法,将不会生成这个目录
                                setSupportZoom(boolean flag)                        是否支持缩放
                                setTextZoom(int textZoom)                                设置字体的缩放想多余页面,默认为100
                                setAllowFileAccess(boolean allow)                是否允许加载本地html文件(false)
                                setDatabaseEnabled(boolean flag)                是否开启数据库缓存
                                setDomStorageEnabled()                                        是否开启DOM缓存
                                setUserAgentString(String ua)                        设置userAgent属性
                                setLoadsImagesAutomatically(boolean flag)        支持自动加载图片
                                setAllowFileAccessFromFileURLs(boolean flag)        
                                        允许通过file url加载的js可以访问其他的本地文件,android4.1之前是默认为true,4.1之后就是false了
                                setAllowUniversalAccessFromFileURLs(boolean flag)
                                        允许通过file url加载的js可以访问其他的资源,4.1之前为true,之后为false
                                boolean getLoadsImagesAutomatically()
                                        是否支持自动加载图片

                       WebViewClient

                                onPageStarted(WebView view, String url, Bitmap favicon)
                                        WebView开始加载页面时回调,一次Frame加载对应一次回调
                                onLoadResource(WebView view, String url)
                                        WebView加载页面资源时回调,每一个资源产生的一次网络加载,除非本地由当前url对应缓存,否则就会加载
                                shouldInterceptRequest(WebView view, String url)
                                        WebView可以拦截某一次的request来返回我们自己加载的数据,这个方法在后面缓存会有用
                                shouldInterceptRequest(WebView view, android.webkit.WebResourseRequest request)
                                        WebView可以拦截某一次的request来返回我们自己加载的数据,这个方法在后面缓存会有用
                                shouldOverrideUrlLoading(WebView view, String url)
                                        是否在WebView内加载页面
                                onReceivedSslError(WebView view, SslErrorHandler handleer, SslError error)
                                        WebView ssl访问证书出错,handler.cancel()取消加载,handler.proceed()就算错误也继续加载
                                onPageFinished(WebView view, String url)
                                        WebView完成加载页面时回调,一次Frame加载对应一次回调
                                onRecevivedError(WebView view, int errorCode, String description, String failingUrl)
                                        WebView访问url出错
                        WebChromeClient        

                                onConsoleMessage(String message, int lineNumber, String sourcelD)
                                        输出Web端日志
                                onProgressChanged(WebView view, int new Progress)
                                        当前WebView加载网页进度
                                onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result)
                                        处理js中的Prompt对话框
                                onJsAlert(WebView view, String url, String message, JsResult result)
                                        Js中调用alert()函数,产生的对话框
                                onReceivedTitle(WebView view, String title)
                                        接受web页面的title
                                onReceivedIcon(WebView view, Bitmap icon)
                                        接受web页面的icon


四、JavaScript交互
1、使用系统方法addJavascriptInterface注入java对象
2、利用shouldOverrideUrlLoading接口,拦截操作
3、利用onJsAlent、onJaconfirm、onJspromt提示接口,也是拦截操作

五、WebView调起浏览器:

                    调起系统浏览器:
  1. Intent intent= new Intent();         
  2.                 intent.setAction("android.intent.action.VIEW");     
  3.                 Uri content_url = Uri.parse("http://www.baidu.com");   
  4.                 intent.setData(content_url);   
  5.                 startActivity(intent);

                    调起指定的浏览器:

  1.                 Intent intent= new Intent();         
  2.                 intent.setAction("android.intent.action.VIEW");     
  3.                 Uri content_url = Uri.parse("http://www.cnblogs.com");   
  4.                 intent.setData(content_url);   

        
intent.setClassName("com.android.browser","com.android.browser.BrowserActivity");   
                startActivity(intent);
                   uc浏览器":"com.uc.browser", "com.uc.browser.ActivityUpdate“  

                    opera    :"com.opera.mini.android", "com.opera.mini.android.Browser"  

                    qq浏览器:"com.tencent.mtt", "com.tencent.mtt.MainActivity"

六、WebView优化:

                1、离线缓存:

  1.                         WebSettings settings = webView.getSettings();
  2.                         settings.setAppCacheEnabled(true);
  3.                         settings.setDatabaseEnabled(true);
  4.                         settings.setDomStorageEnabled(true);        //开启DOM缓存,关闭的话H5自身的一些操作是无效的
  5.                         settings.setCacheMode(WebSettings.LOAD_DEFAULT);
                               LOAD_DEFAULT:        默认的缓存策略;
                                LOAD_NO_CACHE:
                                LOAD_NORMAL:         这个方式跟LOAD_NO_CACHE方式相同,不使用缓存
                                LOAD_CACHE_ELSE_NETWORK:        这个方式不论如何都会从缓存中加载,除非缓存中的网页过期,出现的问题就是打开动态网页时,不能时时更新,会出现上次打开过的状态,除非清除缓存
                                LOAD_CACHE_ONLY :        这个方式只是会使用缓存中的数据,不会使用网络。
                                注意:影响缓存模式的两个http头是if-None-Match和if-Modified-Since,遇到这两个http头,浏览器会把缓存模式改为LODA_NO_CACHE

                                可以优化二次启动的webview的加载速度

                    2、全局WebView:

                           在客户端启动的时候,就初始化一个webview待用,并隐藏。当用户访问webview时直接使用这个webview加载对应的网页,并展示

                        优点:此方法可以有效的减少webview的首次打开时间,在用户去访问页面时,不需要初始化webview

                        缺点:额外的消耗内存;在页面跳转的时候要清空上一个页面的痕迹,容易内存泄漏


                    3、预加载:

                           可以将一些固定的资源打包到APK中,在需要加载这些资源的时候从本地获取

                    4、提升渲染速度:

                        提高渲染的优先级
                                webview.getSettings().setRenderPriority(RenderPriority.HIGH);
                        把图片加载放在最后渲染

  1.                              //  页面加载好以后,再放开图片
  2.                                 webSettings.setBlockNetworkImage(false);
  3.                                 //在页面加载结束以后在开始加载图片
  4.                                  @Override
  5.                                 public void onPageFinished(WebView webVw, String s) {
  6.                                         webVw.getSettings().setBlockNetworkImage(false);
  7.                                         //判断webview是否加载了,图片资源
  8.                                         if (!webVw.getSettings().getLoadsImagesAutomatically()) {
  9.                                                 //设置wenView加载图片资源
  10.                                                 webVw.getSettings().setLoadsImagesAutomatically(true);
  11.                                         }
  12.                                         super.onPageFinished(webVw, s);
  13.                                 }

                    5、使用第三方的浏览器内核代替系统的

                            使用腾讯的浏览器内核:TBS
                        1. TBS(腾讯浏览服务)的优势
                                1) 速度快:相比系统webview的网页打开速度有30+%的提升;
                                2) 省流量:使用云端优化技术使流量节省20+%;
                                3) 更安全:安全问题可以在24小时内修复;
                                4) 更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;
                                5) 兼容好:无系统内核的碎片化问题,更少的兼容性问题;
                                6) 体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;
                                7) 功能全:在Html5、ES6上有更完整支持;
                                8) 更强大:集成强大的视频播放器,支持视频格式远多于系统webview;
                                9) 视频和文件格式的支持x5内核多于系统内核
                                10) 防劫持是x5内核的一大亮点
                        2. 运行环境
                                1)手机ROM版本高于或等于2.2版本
                                2)手机RAM大于500M,该RAM值通过手机 /proc/meminfo 文件的MemTotal动态获取
                        注:如果不满足上述条件,SDK会自动切换到系统WebView,SDK使用者不用关心该切换过程。

                        接入流程:
                                下载SDK和官方的DEMO:https://x5.tencent.com/tbs/sdk.html
                                将里面的jar放到自己项目的libs中,so文件直接复制到jniLibs
                                由于X5不提供64位的so文件,需要手动配置:https://x5.tencent.com/tbs/techn ... a-a77f-0014112bcab7
                                添加权限:

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

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

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

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

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

  6.                                         <!-- 硬件加速对X5视频播放非常重要,建议开启 -->
  7.                                         <uses-permission android:name="android.permission.GET_TASKS" />

                                配置自己的Applcation:
                                                在onCreate()中配置:
                                                        //搜集本地tbs内核信息并上报服务器,服务器返回结果决定使用哪个内核。

  1.                                                    QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

  2.                                                                 @Override
  3.                                                                 public void onViewInitFinished(boolean arg0) {
  4.                                                                         // TODO Auto-generated method stub
  5.                                                                         //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
  6.                                                                         LogUtil.d(" onViewInitFinished is " + arg0);
  7.                                                                 }

  8.                                                                 @Override
  9.                                                                 public void onCoreInitFinished() {
  10.                                                                         // TODO Auto-generated method stub
  11.                                                                 }
  12.                                                         };
  13.                                                         //x5内核初始化接口
  14.                                                         QbSdk.initX5Environment(getApplicationContext(),  cb);

                                   可以使用腾讯提供的工具检测是否配置成功:http://res.imtt.qq.com/TES/TBSSdk_windows.zip,在项目中使用腾讯的webview以及一些配置


            七、使用内置浏览器定位的权限

                    1、在AndroidManifest.xml中声明权限:

  1. <uses-permission android:name="android.permission.INTERNET"/>
  2.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
  3.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
  4.     <uses-permission android:name="android.permission.ACCESS_GPS" />
  5.     <uses-permission android:name="android.permission.ACCESS_ASSISTED_GPS" />
  6.     <uses-permission android:name="android.permission.ACCESS_LOCATION" />
  7.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

                    2、在webSetting中设置:

  1.                      WebSettings settings = webview.getSettings();

  2.                         settings.setGeolocationEnabled(true);//允许地理位置可用

                    3、继承webChromeClient类并重写onGeolocationPermissionShowPrompt方法
  1.         class MyChromeViewClient extends WebChromeClient {
  2.                         public void onGeolocationPermissionsShowPrompt(final String origin, final android.webkit.GeolocationPermissions.Callback callback) {
  3.                                 final boolean remember = true;
  4.                                 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
  5.                                 builder.setTitle("位置信息");
  6.                                 builder.setMessage(origin + "允许获取您的地理位置信息吗?").setCancelable(true).setPositiveButton("允许",
  7.                                                 new DialogInterface.OnClickListener() {
  8.                                                         @Override
  9.                                                         public void onClick(DialogInterface dialog,
  10.                                                                                                 int id) {
  11.                                                                 callback.invoke(origin, true, remember);
  12.                                                         }
  13.                                                 })
  14.                                                 .setNegativeButton("不允许",
  15.                                                                 new DialogInterface.OnClickListener() {
  16.                                                                         @Override
  17.                                                                         public void onClick(DialogInterface dialog,
  18.                                                                                                                 int id) {
  19.                                                                                 callback.invoke(origin, false, remember);
  20.                                                                         }
  21.                                                                 });
  22.                                 AlertDialog alert = builder.create();
  23.                                 alert.show();
  24.                         }
  25.         }

扫描二维码,手机查看
声明:本文来源于互联网,观点仅代表作者本人,不代表hl05.,真实性请妥善甄别。