webview使用的总结<一>

我们在native与网页相结合开发的过程中,如何使用WebView是一个很重要的事,我们也经常会碰到一些通用的问题,下面从配置开始
1.WebSettings用于管理WebView状态配置,当WebView第一次被创建时,WebView包含着一个默认的配置,这些默认的配置将通过get方法返回,通过WebView中的getSettings方法获得一个WebSettings对象,如果一个WebView被销毁,在WebSettings中所有回调方法将抛出IllegalStateException异常。
以下是我经常用到的一些配置
        WebSettings settings = mWebView.getSettings();
        settings.setDefaultTextEncodingName("UTF-8");
        settings.setJavaScriptEnabled(true);//启用js
        settings.setDomStorageEnabled(true);//设置可以使用localStorage
        settings.setRenderPriority(WebSettings.RenderPriority.HIGH);//提高渲染的优先级
        // 判断是否有网络,有的话,使用LOAD_DEFAULT,无网络时,使用LOAD_CACHE_ELSE_NETWORK
        if (NetUtils.checkNetworkAvailable(BaseWebViewActivity.this)) {
            settings.setCacheMode(WebSettings.LOAD_DEFAULT);
        }else {
            settings.setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
        }

        settings.setJavaScriptCanOpenWindowsAutomatically(true);//js和android交互
        String dir = BaseWebViewActivity.this.getDir("cache", Context.MODE_PRIVATE).getPath();
        settings.setAppCachePath(dir); //设置缓存的指定路径
        settings.setAllowFileAccess(true); // 允许访问文件
        settings.setAppCacheEnabled(true); //设置H5的缓存打开,默认关闭
        settings.setUseWideViewPort(true);//设置webview自适应屏幕大小
        settings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);//设置,可能的话使所有列的宽度不超过屏幕宽度
        settings.setLoadWithOverviewMode(true);//设置webview自适应屏幕大小
        settings.setSupportZoom(false);//关闭zoom按钮
        settings.setBuiltInZoomControls(false);//关闭zoom
        settings.setAppCacheMaxSize(1024 * 1024 * 8);
        // WebView是否保存表单数据,默认true,保存数据。
        settings.setSaveFormData(false);
        // 启用数据库
//        settings.setDatabaseEnabled(true);
//        String datadir = BaseWebViewActivity.this.getDir("database", Context.MODE_PRIVATE).getPath();
//        settings.setDatabasePath(datadir);

        //设置WebView代理字符串,如果String为null或为空,将使用系统默认值
        settings.setUserAgentString(settings.getUserAgentString() + " android_webview android_native_navbar version2");
        WebViewJavaScriptInterface webViewJavaScriptInterface = new WebViewJavaScriptInterface(BaseWebViewActivity.this,mWebView,mHandler);
        mWebView.addJavascriptInterface(webViewJavaScriptInterface, "JSInterface");

//设置debug模式
        if (Zlog.isDebug) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                WebView.setWebContentsDebuggingEnabled(true);
            }
        }

[详细请参考http://teachcourse.cn/android-webview-websettings] (http://teachcourse.cn/android-webview-websettings)
2.设置WebViewClient和WebChromeClient
(1)shouldOverrideUrlLoading 返回true和false的区别
默认返回:return super.shouldOverrideUrlLoading(view, url); 这个返回的方法会调用父类方法,也就是跳转至手机浏览器,平时写webview一般都在方法里面写 webView.loadUrl(url); 然后把这个返回值改成下面的false。
返回: return true; webview处理url是根据程序来执行的。
返回: return false; webview处理url是在webview内部执行。
(2)如果我们要支持Alert弹窗,需要实现WebChromeClient当中的一些方法,WebChromeClient中的一些重要方法如下:

onCloseWindow(关闭WebView)
onCreateWindow()
onJsAlert (WebView上alert是弹不出来东西的,需要定制你的WebChromeClient处理弹出)
onJsPrompt()
onJsConfirm()
onProgressChanged(进度显示)
onReceivedIcon(网站图标)
onReceivedTitle(网站标题)

支持Alert弹窗,主要是重写onJsAlert()方法

(3)错误页面的监控主要在WebViewClient这个类完成,它主要是帮助WebView处理各种通知、请求事件的,具体来说包括:

onLoadResource
onPageStart
onPageFinish
onReceiveError 
onReceivedHttpAuthRequest
shouldInterceptRequest

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

 @Override
  public void onLoadResource(WebView view, String url) {
            super.onLoadResource(view, url);
            int i = url.indexOf( ".jpg" );
            Zlog.ii("lxm ss webview onLoadResource:" + i);
//            mEventListener.onWebViewEvent(CustomWebView. this , OnWebViewEventListener.EVENT_ON_LOAD_RESOURCE, url);
            if (url.indexOf( ".jpg" ) > 0 ) {
                if (progressDialog != null && progressDialog.isShowing()) {
                    progressDialog.dismiss();
                }//请求图片时即显示页面
//                mEventListener.onWebViewEvent(CustomWebView. this , OnWebViewEventListener.EVENT_ON_HIDE_PROGRESS, view.getUrl());
            }
        }

自定义404界面等信息,就可以通过重写onReceiveError()完成
自定义错误页面:可以加载本地的静态网页

@Override
public void onReceivedError (WebView view, int errorCode, String description, String failingUrl) {
    super.onReceivedError(view, errorCode, description, failingUrl);
     //loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
     //mErrorFrame.setVisibility(View.VISIBLE);
     view.loadUrl("javascript:document.body.innerHTML=\"" + data + "\"");
     view.loadDataWithBaseURL(null, "", "text/html", "utf-8", null);
     view.loadUrl(NetUtils.NETWORK_ERROR_PAGE_URL);
}

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

  @Override
        public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
            WebResourceResponse response = null;
            // 检查该资源是否已经提前下载完成。我采用的策略是在应用启动时,用户在 wifi 的网络环境下                // 提前下载 H5 页面需要的资源。
            boolean resDown = JSHelper.isURLDownValid(url);
            if (resDown) {
                jsStr = JsjjJSHelper.getResInputStream(url);
                if (url.endsWith(".png")) {
                    response = getWebResourceResponse(url, "image/png", ".png");
                } else if (url.endsWith(".gif")) {
                    response = getWebResourceResponse(url, "image/gif", ".gif");
                } else if (url.endsWith(".jpg")) {
                    response = getWebResourceResponse(url, "image/jepg", ".jpg");
                } else if (url.endsWith(".jepg")) {
                    response = getWebResourceResponse(url, "image/jepg", ".jepg");
                } else if (url.endsWith(".js") && jsStr != null) {
                    response = getWebResourceResponse("text/javascript", "UTF-8", ".js");
                } else if (url.endsWith(".css") && jsStr != null) {
                    response = getWebResourceResponse("text/css", "UTF-8", ".css");
                } else if (url.endsWith(".html") && jsStr != null) {
                    response = getWebResourceResponse("text/html", "UTF-8", ".html");
                }
            }
            // 若 response 返回为 null , WebView 会自行请求网络加载资源。
            return response;
//            return super.shouldInterceptRequest(view, request);
        }

3.WebView的常用方法

方法 描述
void goBack() 后退。
void goForward() 前进。
void loadUrl(String url) 加载指定URL对应的网页。
void loadUrl(String url, Map additionalHttpHeaders) 用额外的HTTP头加载指定的URL对应的网页。
boolean zoomIn() 放大网页。
boolean zoomOut() 缩小网页。
void addJavascriptInterface(Object object, String name) 将Java对象置入WebView中。
void clearCache(boolean includeDiskFiles) 清空缓存。
void clearHistory() 清空访问历史。
Bitmap getFavicon() 获取当前网页的favicon图标。
String getOriginalUrl() 获得当前网页的URL。
String getUrl() 获得当前网页的URL。
int getProgress() 获得当前网页的显示进度。
String getTitle() 获得当前网页的Title。
boolean pageDown(boolean bottom) 向下滚动视图大小的一半。
boolean pageUp(boolean top) 向上滚动视图大小的一半。
void reload() 重新加载当前网页。
void zoomBy(float zoomFactor) 指定网页缩放大小。
void requestFocus() 是页面获得焦点。

更详细的WebView API可查看官方文档:http://developer.android.com/reference/android/webkit/WebView.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
腾讯X5内核WebView是一款基于Chromium内核的浏览器内核,相比于原生WebView,具有更好的性能和稳定性。以下是一些优化实践总结: 1. 集成腾讯X5内核 在使用WebView时,可以使用腾讯提供的X5内核替代原生内核。在集成X5内核时,需要在build.gradle文件中添加依赖: ``` dependencies { implementation 'com.tencent.tbs.tbssdk:sdk:43697' } ``` 2. 预加载 使用X5内核时,可以通过预加载提高WebView的响应速度。可以在应用启动时预加载X5内核: ``` // 在Application的onCreate方法中 QbSdk.initX5Environment(context, null) ``` 3. 启用多进程 如果应用中使用了多个WebView,可以启用多进程来提高性能和稳定性。可以在AndroidManifest.xml文件中设置: ``` <application android:name=".MyApplication" android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" android:process=":webview"> ``` 4. 启用硬件加速 在使用X5内核时,可以启用硬件加速来提高渲染速度。可以在布局文件中设置: ``` <com.tencent.smtt.sdk.WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" android:layerType="hardware" /> ``` 5. 使用缓存 使用缓存可以减少网络请求,提高WebView的加载速度。可以在初始化WebView时设置: ``` val webSettings = webView.settings webSettings.cacheMode = WebSettings.LOAD_CACHE_ELSE_NETWORK ``` 以上是一些常见的优化实践总结,可以根据具体的场景进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值