Android开发:聊聊WebView的使用

插图

前言

尽管WebView是官方提供的控件,但使用使用起来依然是踩坑无数,想要获得一个较好的用户体验更是难上加难。接下来将重点说一下,个人在使用过程中总结出的一些经验和遇到的问题,希望能够对大家的开发带来一些帮助。

基本使用

mWebView.loadUrl(url);

loadUrl() 如果只是单纯的想要显示一个静态网页的话,这样加载就足够了,但往往开发中,需要许多其他的设置,这就需要用到WebView 的 WebSettings。

WebSettings webSettings = mWebView.getSettings();

WebSettings 的提供的方法就不一一介绍了,如果想想了解大家可以去这里看看:传送门

网页的交互是依赖于 JS 的,通过下面设置,可以开启 H5 网页的交互功能。

webSettings.setJavaScriptEnabled(true);

关于编译器会提示警告的问题,可以加入 @SuppressLint(“SetJavaScriptEnabled”) 来避免编译器的提示。

  1. JS 与本地交互
mWebView.addJavascriptInterface(new JavaScriptInterface(this),
                "android");

将 对象注入到WebView 中,WebView 加载的网页均可调用该对象中的方法。"android" 为对象名。下面看一下对象的具体实现。

// 网页调动js方法
    final class JavaScriptInterface {
        
        public JavaScriptInterface() {
        }

        @JavascriptInterface
        public void appRedirect(String url) {
            // 具体操作
        }
    }

Android 从API17之后,提供注解 @JavascriptInterface ,也是为了避免出现安全隐患。

  1. 本地调用网页JS
mWebView.loadUrl("javascript:appPayResultQuery()");  

而 appPayResultQuery() 使用网页提供的JS方法。

基本使用差不多这些就够了,接下来呢,重点说一下在开发工程中遇到的一些问题及原因,还有相应的解决方案。

使用过程中的问题及解决方案

  1. WebView 与 H5点击交互时,自动跳转到浏览器加载的问题
    WebView默认是使用第三方或系统默认浏览器打开网页,如果要避免该行为,使网页用WebView打开,覆盖该行为即可,如下操作:
mWebView.setWebViewClient(new WebViewClient(){  
    @Override  
    public boolean shouldOverrideUrlLoading(WebView view, String url) {  
        view.loadUrl(url);  
        return true;  
    }  
});
  1. 证书引起的相关问题,例如:WebView 加载网页存在https协议时,证书认证失败。
    这里提供一种非常暴力的解决方法,如果WebView对于加载的网页的安全要求并不是很高的话,可以使用该方法。
mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                handler.proceed();//接受证书
            }
        });
  1. 某些网页在Android 5.0及其以上的版本加载成功,图片却无法显示的问题,遇到这种情况的原因可能有很多,这里说一下我在遇到这种情况时的原因:该网页是https协议,而加载的图片是 http协议。解决方法呢,也简单:
    private void setMinedContentMode(){
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
    }

该方法的解释是:
当一个安全的来源(origin)试图从一个不安全的来源加载资源时配置WebView的行为。默认情况下,KITKAT及更低版本默认值为MIXED_CONTENT_ALWAYS_ALLOW,LOLLIPOP版本默认值MIXED_CONTENT_NEVER_ALLOW,WebView首选的最安全的操作模式为MIXED_CONTENT_NEVER_ALLOW ,不鼓励使用MIXED_CONTENT_ALWAYS_ALLOW。

  1. WebView 返回上一页失败,可能是当前页面是由重定向过来的,当返回到上一页时,又会重新重定向跳转到该页。如何解决呢?实际上我们可以通过调用JS来解决。
webview.loadUrl("javascript:window.history.back();");
  1. WebView 播放视频的问题,当你播放了视频之后,返回上一界面,或者跳转到其他页面,你会发现,播放的视频声音还在播放。
    原因就是 WebView threads never stop!
    解决方法也很简单,在相应的生命周期中,对 WebView 进行相关的处理。由于WebView 本身占用着很多资源,当它离开屏幕的时候,也应该释放其占有的 CPU ,网络资源。
private void destroyWebView() {
        //
        if (mWebView != null) {
            mWebView.removeAllViews();
            mWebView.destroy();
            mWebView = null;
        }
    }

    private void pauseWebView() {
        //
        if (mWebView == null) {
            return;
        }
        mWebView.onPause();
    }

    private void resumeWebView() {
        //
        if (mWebView == null) {
            return;
        }
        mWebView.onResume();
    }

WebView 也提供了相应的方法,我们只需要在相应的生命周期中调用即可。

总结

关于WebView的使用就说这么多,关于其他的拓展就留给大家去解决吧。如果有什么不对的地方请大家指出,或者有更好地解决方法,也请留言讨论吧。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,919评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,567评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,316评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,294评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,318评论 6 390
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,245评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,120评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,964评论 0 275
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,376评论 1 313
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,592评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,764评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,460评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,070评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,697评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,846评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,819评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,665评论 2 354

推荐阅读更多精彩内容