WebView開源庫終極方案

目錄介紹

  • 01.前沿說明
    • 1.1 案例展示效果
    • 1.2 該庫功能和優(yōu)勢(shì)
    • 1.3 相關(guān)類介紹說明
    • 1.4 WebView知識(shí)點(diǎn)
  • 02.如何使用
    • 2.1 如何引入
    • 2.2 最簡(jiǎn)單使用
    • 2.3 常用api
    • 2.4 使用建議
    • 2.5 異常狀態(tài)類型區(qū)分
    • 2.6 該庫流程圖
  • 03.js調(diào)用
    • 3.1 Java調(diào)用js方法
    • 3.2 js調(diào)用java方法
    • 3.3 js的調(diào)用時(shí)機(jī)分析
    • 3.4 js交互原理分析
  • 04.問題反饋
  • 05.webView優(yōu)化
  • 06.關(guān)于參考
  • 07.其他說明介紹

01.前沿說明

  • 基于騰訊x5開源庫单默,提高webView開發(fā)效率次员,大概要節(jié)約你百分之六十的時(shí)間成本。該案例支持處理js的交互邏輯且無耦合谆吴、同時(shí)暴露進(jìn)度條加載進(jìn)度辆布、可以監(jiān)聽異常error狀態(tài)、支持視頻播放并且可以全頻、支持加載word瞳脓,xls,ppt澈侠,pdf劫侧,txt等文件文檔、發(fā)短信、打電話烧栋、發(fā)郵件写妥、打開文件操作上傳圖片、喚起原生App审姓、x5庫為最新版本珍特,功能強(qiáng)大。項(xiàng)目地址:webView開源庫
  • 同時(shí)魔吐,該案例中扎筒,04問題反饋也記錄了絕大多數(shù)實(shí)際開發(fā)中遇到的問題,如果還有其他的問題酬姆,也可以發(fā)送給我嗜桌,我收集起來放到一起,方便后期查閱辞色。
  • 可以說症脂,該開源庫,以及附帶的webView基礎(chǔ)知識(shí)點(diǎn)淫僻,問題匯總诱篷,以及優(yōu)化方案等筆記,相對(duì)來說比較系統(tǒng)而又全面的梳理webView的知識(shí)體系雳灵,相對(duì)而言也是比較實(shí)用的棕所,也不乏參考了一些好的案例和博客文章。

1.1 案例展示效果

  • WebView啟動(dòng)過程大概分為以下幾個(gè)階段悯辙,這里借鑒美團(tuán)的一張圖片
    • image

1.2 該庫功能和優(yōu)勢(shì)

  • 提高webView開發(fā)效率琳省,大概要節(jié)約你百分之六十的時(shí)間成本,一鍵初始化操作躲撰;
  • 支持處理js的交互邏輯针贬,方便快捷,并且無耦合拢蛋,操作十分簡(jiǎn)單桦他;
  • 暴露進(jìn)度條加載進(jìn)度,結(jié)束谆棱,以及異常狀態(tài)(分多種狀態(tài):無網(wǎng)絡(luò)快压,404,onReceivedError垃瞧,sslError異常等)listener給開發(fā)者蔫劣;
  • 支持視頻播放,可以切換成全頻播放視頻个从,可旋轉(zhuǎn)屏幕脉幢,暴露視頻操作監(jiān)聽listener給開發(fā)者歪沃;
  • 集成了騰訊x5的WebView,最新版本嫌松,功能強(qiáng)大沪曙;
  • 支持打開文件的操作,比如打開相冊(cè)豆瘫,然后選中圖片上傳,兼容版本(5.0)菊值;
  • 支持加載word外驱,xls,ppt腻窒,pdf昵宇,txt等文件文檔,使用方法十分簡(jiǎn)單儿子;
  • 支持設(shè)置仿微信加載H5頁面進(jìn)度條瓦哎,完全無耦合,操作簡(jiǎn)單柔逼,極大提高用戶體驗(yàn)蒋譬;
  • 支持用戶按照規(guī)范自定義WebViewClient和WebChromeClient,不影響js通信愉适;
  • 匯集絕大多數(shù)問題犯助,以及解決方案,是學(xué)習(xí)和深入理解webView的一個(gè)比較全面的案例维咸;

1.3 相關(guān)類介紹說明

  • BridgeHandler 接口剂买,主要處理消息回調(diào)邏輯
  • BridgeUtil 工具類,靜態(tài)常量癌蓖,以及獲取js消息的一些方法瞬哼,final修飾
  • BridgeWebView 自定義WebView類,主要處理與js之間的消息
  • CallBackFunction js回調(diào)
  • DefaultHandler 默認(rèn)的BridgeHandler
  • InterWebListener 接口租副,web的接口回調(diào)坐慰,包括常見狀態(tài)頁面切換【狀態(tài)頁面切換】,進(jìn)度條變化【顯示和進(jìn)度監(jiān)聽】等
  • Message 自定義消息Message實(shí)體類
  • ProgressWebView 自定義帶進(jìn)度條的webView
  • WebViewJavascriptBridge js橋接接口
  • X5WebChromeClient 自定義x5的WebChromeClient用僧,處理進(jìn)度監(jiān)聽讨越,title變化,以及上傳圖片永毅,后期添加視頻處理邏輯
  • X5WebUtils 工具類把跨,初始化騰訊x5瀏覽器webView,及調(diào)用該類init方法
  • X5WebView 可以使用這個(gè)類沼死,方便統(tǒng)一初始化WebSettings的一些屬性着逐,如果不用這里的,想單獨(dú)初始化setting屬性,也可以直接使用BridgeWebView
  • X5WebViewClient 自定義x5的WebViewClient耸别,如果要自定義WebViewClient必須要集成此類健芭,一定要繼承該類,因?yàn)樽⑷雑s監(jiān)聽是在該類中操作的
  • WebProgress 仿微信加載H5頁面的WebView進(jìn)度條

1.4 WebView基礎(chǔ)知識(shí)點(diǎn)

  • 01.常用的基礎(chǔ)介紹
  • 02.Android調(diào)用Js
  • 03.Js調(diào)用Android
  • 04.WebView.loadUrl(url)流程
  • 05.js的調(diào)用時(shí)機(jī)分析
  • 06.清除緩存數(shù)據(jù)方式有哪些
  • 07.如何使用DeepLink
  • 08.為什么WebView那么難搞
  • 09.如何處理加載錯(cuò)誤
  • 10.應(yīng)用被作為第三方瀏覽器打開
  • 11.理解WebView獨(dú)立進(jìn)程
  • 12.使用外部瀏覽器下載
  • 13.tel,sms等協(xié)議用法
  • 更多內(nèi)容看wiki

02.如何使用

2.1 如何引入

  • 如何引用秀姐,該x5的庫已經(jīng)更新到最新版本慈迈,引用最新1.2.0穩(wěn)定版
    implementation 'cn.yc:WebViewLib:1.2.0'
    

2.2 最簡(jiǎn)單使用

  • 項(xiàng)目初始化
    X5WebUtils.init(this);
    
  • 最普通使用,需要自己做手動(dòng)設(shè)置setting相關(guān)屬性
    <BridgeWebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbarSize="3dp" />
    
  • 也可以使用X5WebView省有,已經(jīng)做了常見的setting屬性設(shè)置
    <X5WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbarSize="3dp" />
    
  • 如果想有帶進(jìn)度的痒留,可以使用ProgressWebView
    <可以使用ProgressWebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scrollbarSize="3dp" />
    
  • 如何使用自己的WebViewClient和WebChromeClient
    //主要是在X5WebViewClient和X5WebChromeClient已經(jīng)做了很多常見的邏輯處理,如果不滿足你使用蠢沿,可以如下這樣寫
    MyX5WebViewClient webViewClient = new MyX5WebViewClient(webView, this);
    webView.setWebViewClient(webViewClient);
    MyX5WebChromeClient webChromeClient = new MyX5WebChromeClient(this);
    webView.setWebChromeClient(webChromeClient);
    
    private class MyX5WebViewClient extends X5WebViewClient {
        public MyX5WebViewClient(BridgeWebView webView, Context context) {
            super(webView, context);
        }
        
        //重寫你需要的方法即可
    }
    
    private class MyX5WebChromeClient extends X5WebChromeClient{
        public MyX5WebChromeClient(Activity activity) {
            super(activity);
        }
        
        //重寫你需要的方法即可
    }
    
  • 針對(duì)類似購物的商品詳情頁面的webView
    • 當(dāng)WebView在最頂部或者最底部的時(shí)候伸头,不消費(fèi)事件,則可以使用VerticalWebView

2.3 常用api

  • 關(guān)于web的接口回調(diào)舷蟀,包括常見狀態(tài)頁面切換恤磷,進(jìn)度條變化等監(jiān)聽處理
    mWebView.getX5WebChromeClient().setWebListener(interWebListener);
    private InterWebListener interWebListener = new InterWebListener() {
        @Override
        public void hindProgressBar() {
            pb.setVisibility(View.GONE);
        }
    
        @Override
        public void showErrorView(@X5WebUtils.ErrorType int type) {
            //設(shè)置自定義異常錯(cuò)誤頁面
        }
    
        @Override
        public void startProgress(int newProgress) {
            //該方法是是監(jiān)聽進(jìn)度條進(jìn)度變化的邏輯
            pb.setProgress(newProgress);
        }
        
        @Override
        public void showTitle(String title) {
            //該方法是監(jiān)聽h5中title
        }
    };
    
  • 關(guān)于視頻播放的時(shí)候,web的接口回調(diào)野宜,主要是視頻相關(guān)回調(diào)扫步,比如全頻,取消全頻匈子,隱藏和現(xiàn)實(shí)webView
    x5WebChromeClient = x5WebView.getX5WebChromeClient();
    x5WebChromeClient.setVideoWebListener(new VideoWebListener() {
        @Override
        public void showVideoFullView() {
            //視頻全頻播放時(shí)監(jiān)聽
        }
    
        @Override
        public void hindVideoFullView() {
            //隱藏全頻播放锌妻,也就是正常播放視頻
        }
    
        @Override
        public void showWebView() {
            //顯示webView
        }
    
        @Override
        public void hindWebView() {
            //隱藏webView
        }
    });
    
  • 其他api說明
    //X5WebView中
    //設(shè)置是否開啟密碼保存功能,不建議開啟旬牲,默認(rèn)已經(jīng)做了處理修赞,存在盜取密碼的危險(xiǎn)
    mWebView.setSavePassword(false);
    //是否開啟軟硬件加速
    mWebView.setOpenLayerType(false);
    //獲取x5WebChromeClient對(duì)象
    x5WebChromeClient = mWebView.getX5WebChromeClient();
    //獲取x5WebViewClient對(duì)象
    x5WebViewClient = mWebView.getX5WebViewClient();
    
  • 關(guān)于如何使用仿微信加載H5頁面進(jìn)度條
    • 前端頁面時(shí)受到網(wǎng)路環(huán)境匆背,頁面內(nèi)容大小的影響有時(shí)候會(huì)讓用戶等待很久。顯示一個(gè)加載進(jìn)度條可以說很大程度上提升用戶的體驗(yàn)。
    private WebProgress pb;
    //顯示進(jìn)度條
    pb.show();
    //設(shè)置進(jìn)度條過度顏色
    pb.setColor(Color.BLUE,Color.RED);
    //設(shè)置單色進(jìn)度條
    pb.setColor(Color.BLUE);
    //為單獨(dú)處理WebView進(jìn)度條
    pb.setWebProgress(newProgress);
    //進(jìn)度完成后消失
    pb.hide();
    
  • 設(shè)置cookie和清除cookie操作
    //同步cookie
    X5WebUtils.syncCookie(this,"url",cookieList);
    //清除cookie
    X5WebUtils.removeCookie(this);
    

2.4 使用建議

  • 優(yōu)化一下相關(guān)的操作
    • 關(guān)于設(shè)置js支持的屬性
    @Override
    public void onResume() {
        super.onResume();
        if (mWebView != null) {
            mWebView.getSettings().setJavaScriptEnabled(true);
        }
    }
    
    @Override
    protected void onStop() {
        super.onStop();
        if (mWebView != null) {
            mWebView.getSettings().setJavaScriptEnabled(false);
        }
    }
    
    • 關(guān)于destroy銷毀邏輯
    @Override
    protected void onDestroy() {
        try {
            if (webView != null) {
                webView.stopLoading();
                webView.destroy();
                webView = null;
            }
        } catch (Exception e) {
            Log.e("X5WebViewActivity", e.getMessage());
        }
        super.onDestroy();
    }
    

2.5 關(guān)于web頁面異常狀態(tài)區(qū)分類型

  • 對(duì)于web加載異常党巾,分為多種狀態(tài)卓研,比如常見的有早敬,沒有網(wǎng)絡(luò)寞埠;404加載異常;onReceivedError通贞,請(qǐng)求網(wǎng)絡(luò)出現(xiàn)error朗若;在加載資源時(shí)通知主機(jī)應(yīng)用程序發(fā)生SSL錯(cuò)誤
    @Override
    public void showErrorView(@X5WebUtils.ErrorType int type) {
        switch (type){
            //沒有網(wǎng)絡(luò)
            case X5WebUtils.ErrorMode.NO_NET:
                break;
            //404,網(wǎng)頁無法打開
            case X5WebUtils.ErrorMode.STATE_404:
                break;
            //onReceivedError昌罩,請(qǐng)求網(wǎng)絡(luò)出現(xiàn)error
            case X5WebUtils.ErrorMode.RECEIVED_ERROR:
                break;
            //在加載資源時(shí)通知主機(jī)應(yīng)用程序發(fā)生SSL錯(cuò)誤
            case X5WebUtils.ErrorMode.SSL_ERROR:
                break;
            default:
                break;
        }
    }
    

2.6 該庫流程圖

  • java調(diào)用js的流程圖
    • 第一步操作:mWebView.callHandler("functionInJs", "小楊逗比", new CallBackFunction() {//這里面是回調(diào)});
    • 第二步操作:將handlerName哭懈,data,responseCallback茎用,封裝到Message對(duì)象中遣总,然后開始分發(fā)數(shù)據(jù)睬罗,最后webView執(zhí)行_handleMessageFromNative;
    • 第三步操作:去WebViewJavascriptBridge.js類中找到_handleMessageFromNative方法旭斥,js根據(jù)"functionInJs"找到對(duì)應(yīng)的js方法并且執(zhí)行容达;
    • 第四步操作:js把運(yùn)行結(jié)果保存到message對(duì)象中,然后添加到j(luò)s消息隊(duì)列中垂券;
    • 第五步操作:在_dispatchMessageFromNative方法中花盐,可以看到,js向native發(fā)送 "消息隊(duì)列中有消息" 的通知菇爪;
    • 第六步操作:webView執(zhí)行js的_fetchQueue(WebViewJavascriptBridge.js類)方法算芯;
    • 第七步操作:js把消息隊(duì)列中的所有消息都一起回傳給webView;
    • 第八步操作:webView收到所有的消息娄帖,一個(gè)一個(gè)串行處理也祠,注意其中包括 "functionInJs"方法運(yùn)行的結(jié)果的消息昙楚;
  • js調(diào)用Android的流程圖
    • 第一步操作:mWebView.registerHandler("toPhone", new BridgeHandler() { //回調(diào)});
    • 第二步操作:調(diào)用messageHandlers.put(handlerName, handler)近速,將名稱和BridgeHandler對(duì)象放到map集合中
    • 第三步操作:在shouldOverrideUrlLoading方法中攔截url,與網(wǎng)頁約定好一個(gè)協(xié)議堪旧,匹配則執(zhí)行相應(yīng)操作削葱,也就是利用WebViewClient接口回調(diào)方法攔截url
    • 第四步操作:如果是url.startsWith(BridgeUtil.YY_RETURN_DATA)則有數(shù)據(jù)返回;如果是BridgeUtil.YY_OVERRIDE_SCHEMA則刷新消息隊(duì)列
    • 第五步操作:通過BridgeHandler對(duì)象淳梦,將data和callBackFunction返回交給開發(fā)者

03.js交互操作

3.1 Java調(diào)用js的使用方法

  • 代碼如下所示析砸,下面updateAttentionStatus代表js這邊的方法名稱
    • webView.callHandler(“updateAttentionStatus”, …, new CallBackFunction());這是Java層主動(dòng)調(diào)用Js的”updateAttentionStatus”方法。
    mWebView.callHandler("updateAttentionStatus", attention, new CallBackFunction() {
        @Override
        public void onCallBack(String data) {
    
        }
    });
    

3.2 js調(diào)用java的使用方法

  • 代碼如下所示爆袍,下面中的toPhone代表的是Android這邊提供給js的方法名稱
    • webView.registerHandler(“toPhone”, …);這是Java層注冊(cè)了一個(gè)叫”toPhone”的接口方法首繁,目的是提供給Js來調(diào)用。這個(gè)”toPhone”的接口方法的回調(diào)就是BridgeHandler.handler()陨囊。
    mWebView.registerHandler("toPhone", new BridgeHandler() {
        @Override
        public void handler(String data, CallBackFunction function) {
            try {
                JSONObject jsonData = new JSONObject(data);
                String phone = jsonData.optString("phone");
                //todo 打電話
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    });
    
  • 如何回調(diào)數(shù)據(jù)給web那邊
    //注意弦疮,這里回傳數(shù)據(jù)目前只是支持String字符串類型
    function.onCallBack("回調(diào)數(shù)據(jù)");
    

3.3 js的調(diào)用時(shí)機(jī)分析

  • onPageFinished()或者onPageStarted()方法中注入js代碼
    • 做過WebView開發(fā),并且需要和js交互蜘醋,大部分都會(huì)認(rèn)為js在WebViewClient.onPageFinished()方法中注入最合適胁塞,此時(shí)dom樹已經(jīng)構(gòu)建完成,頁面已經(jīng)完全展現(xiàn)出來压语。但如果做過頁面加載速度的測(cè)試啸罢,會(huì)發(fā)現(xiàn)WebViewClient.onPageFinished()方法通常需要等待很久才會(huì)回調(diào)(首次加載通常超過3s),這是因?yàn)閃ebView需要加載完一個(gè)網(wǎng)頁里主文檔和所有的資源才會(huì)回調(diào)這個(gè)方法胎食。
    • 能不能在WebViewClient.onPageStarted()中注入呢扰才?答案是不確定。經(jīng)過測(cè)試厕怜,有些機(jī)型可以训桶,有些機(jī)型不行累驮。在WebViewClient.onPageStarted()中注入還有一個(gè)致命的問題——這個(gè)方法可能會(huì)回調(diào)多次,會(huì)造成js代碼的多次注入舵揭。
    • 從7.0開始谤专,WebView加載js方式發(fā)生了一些小改變,官方建議把js注入的時(shí)機(jī)放在頁面開始加載之后午绳。
  • WebViewClient.onProgressChanged()方法中注入js代碼
    • WebViewClient.onProgressChanged()這個(gè)方法在dom樹渲染的過程中會(huì)回調(diào)多次置侍,每次都會(huì)告訴我們當(dāng)前加載的進(jìn)度。
      • 在這個(gè)方法中拦焚,可以給WebView自定義進(jìn)度條蜡坊,類似微信加載網(wǎng)頁時(shí)的那種進(jìn)度條
      • 如果在此方法中注入js代碼,則需要避免重復(fù)注入赎败,需要增強(qiáng)邏輯秕衙。可以定義一個(gè)boolean值變量控制注入時(shí)機(jī)
    • 那么有人會(huì)問僵刮,加載到多少才需要處理js注入邏輯呢据忘?
      • 正是因?yàn)檫@個(gè)原因,頁面的進(jìn)度加載到80%的時(shí)候搞糕,實(shí)際上dom樹已經(jīng)渲染得差不多了勇吊,表明WebView已經(jīng)解析了<html>標(biāo)簽,這時(shí)候注入一定是成功的窍仰。在WebViewClient.onProgressChanged()實(shí)現(xiàn)js注入有幾個(gè)需要注意的地方:
      • 1 上文提到的多次注入控制汉规,使用了boolean值變量控制
      • 2 重新加載一個(gè)URL之前,需要重置boolean值變量驹吮,讓重新加載后的頁面再次注入js
      • 3 如果做過本地js针史,css等緩存,則先判斷本地是否存在碟狞,若存在則加載本地啄枕,否則加載網(wǎng)絡(luò)js
      • 4 注入的進(jìn)度閾值可以自由定制,理論上10%-100%都是合理的篷就,不過建議使用了75%到90%之間可以射亏。

3.4 js交互原理分析

  • 01.WebView加載html頁面
  • 02.加載WebViewJavascriptBridge.js
  • 03.分析WebViewJavascriptBridge.js
  • 04.頁面Html注冊(cè)”functionInJs”方法
  • 05.“functionInJs”執(zhí)行結(jié)果回傳Java
  • 更多內(nèi)容看wiki

04.問題反饋

  • 4.0.0 WebView進(jìn)化史介紹
  • 4.0.1 提前初始化WebView必要性
  • 4.0.2 x5加載office資源
  • 4.0.3 WebView播放視頻問題
  • 4.0.4 無法獲取webView的正確高度
  • 4.0.5 使用scheme協(xié)議打開鏈接風(fēng)險(xiǎn)
  • 4.0.6 如何處理加載錯(cuò)誤
  • 4.0.7 webView防止內(nèi)存泄漏
  • 4.0.8 關(guān)于js注入時(shí)機(jī)修改
  • 4.0.9 視頻播放寬度超過屏幕
  • 4.1.0 如何保證js安全性
  • 4.1.1 如何代碼開啟硬件加速
  • 4.1.2 WebView設(shè)置Cookie
  • 4.1.3 開啟硬件加速導(dǎo)致的閃爍問題
  • 4.1.4 webView加載網(wǎng)頁不顯示圖片
  • 4.1.5 繞過證書校驗(yàn)漏洞
  • 4.1.6 allowFileAccess漏洞
  • 4.1.7 WebView嵌套ScrollView問題
  • 4.1.8 WebView中圖片點(diǎn)擊放大
  • 4.1.9 頁面滑動(dòng)期間不渲染/執(zhí)行
  • 4.2.0 被運(yùn)營(yíng)商劫持和注入問題
  • 4.2.1 解決資源加載緩慢問題
  • 4.2.2 判斷是否已經(jīng)滾動(dòng)到頁面底端
  • 4.2.3 使用loadData加載html亂碼
  • 4.2.4 WebView下載進(jìn)度無法監(jiān)聽
  • 4.2.5 webView出現(xiàn)302/303重定向
  • 4.2.6 webView出現(xiàn)302/303白屏
  • 4.2.8 onReceiveError問題
  • 4.2.9 loadUrl在19以上超過2097152個(gè)字符失效
  • 4.3.0 WebViewJavascriptBridge: WARNING
  • 4.3.1 Android與js傳遞數(shù)據(jù)大小有限制
  • 4.3.2 多次調(diào)用callHandler部分回調(diào)函數(shù)未被調(diào)用
  • 4.3.3 字符串轉(zhuǎn)義bug探討
  • 4.3.8 Javascript調(diào)用原生方法會(huì)偶現(xiàn)失敗
  • 4.3.9 dispatchMessage運(yùn)行主線程問題
  • 4.4.0 怎么實(shí)現(xiàn)WebView免流方案
  • 4.4.1 Channel is unrecoverably broken and will be disposed!
  • 4.4.2 定制js的alert,confirm和prompt對(duì)話框
  • 4.4.3 x5長(zhǎng)按圖片如何操作
  • 4.4 4 x5長(zhǎng)按文字內(nèi)容如何自定義彈窗
  • 4.4.5 webView.goBack()會(huì)刷新頁面嗎
  • 4.4.6 mWebView.scrollTo(0, 0)回頂部失效
  • 4.4.7 部分手機(jī)監(jiān)聽滑動(dòng)頂部或底部失效
  • 4.4.8 prompt的一個(gè)坑導(dǎo)致js掛掉
  • 4.4.9 webView背景設(shè)置為透明無效探索
  • 4.5.0 如何屏蔽掉WebView中長(zhǎng)按事件
  • 4.5.1 WeView出現(xiàn)OOM影響主進(jìn)程如何避免
  • 4.5.2 WebView域控制不嚴(yán)格漏洞
  • 4.5.3 下載文件時(shí)的路徑穿越問題
  • 4.5.4 WebView中http和https混合使用問題
  • 4.5.5 調(diào)用系統(tǒng)EMAIL發(fā)送郵件崩潰
  • 4.5.7 WebView訪問部分網(wǎng)頁崩潰問題
  • 更多問題反饋內(nèi)容

05.webView優(yōu)化

  • 5.0.1 視頻全屏播放按返回頁面被放大
  • 5.0.2 加快加載webView中的圖片資源
  • 5.0.3 自定義加載異常error的狀態(tài)頁面
  • 5.0.4 WebView硬件加速導(dǎo)致頁面渲染閃爍
  • 5.0.5 WebView加載證書錯(cuò)誤
  • 5.0.6 web音頻播放銷毀后還有聲音
  • 5.0.7 DNS采用和客戶端API相同的域名
  • 5.0.8 如何設(shè)置白名單操作
  • 5.0.9 后臺(tái)無法釋放js導(dǎo)致發(fā)熱耗電
  • 5.1.0 可以提前顯示加載進(jìn)度條
  • 5.1.1 WebView密碼明文存儲(chǔ)漏洞優(yōu)化
  • 5.1.2 頁面關(guān)閉后不要執(zhí)行web中js
  • 5.1.3 WebView + HttpDns優(yōu)化
  • 5.1.4 如何禁止WebView返回時(shí)刷新
  • 5.1.5 WebView處理404、500邏輯
  • 5.1.6 WebView判斷斷網(wǎng)和鏈接超時(shí)
  • 5.1.7 @JavascriptInterface注解方法注意點(diǎn)
  • 5.1.8 使用onJsPrompt實(shí)現(xiàn)js通信注意點(diǎn)
  • 5.1.9 Cookie同步場(chǎng)景和具體操作
  • 5.2.0 shouldOverrideUrlLoading處理多類型
  • 更多webView優(yōu)化內(nèi)容

06.關(guān)于參考

07.其他說明介紹

關(guān)于博客匯總鏈接

其他推薦

  • 博客筆記大匯總【15年10月到至今】,包括Java基礎(chǔ)及深入知識(shí)點(diǎn)咐柜,Android技術(shù)博客兼蜈,Python學(xué)習(xí)筆記等等攘残,還包括平時(shí)開發(fā)中遇到的bug匯總,當(dāng)然也在工作之余收集了大量的面試題为狸,長(zhǎng)期更新維護(hù)并且修正歼郭,持續(xù)完善……開源的文件是markdown格式的!同時(shí)也開源了生活博客辐棒,從12年起病曾,積累共計(jì)47篇[近100萬字],轉(zhuǎn)載請(qǐng)注明出處漾根,謝謝泰涂!
  • 鏈接地址:https://github.com/yangchong211/YCBlogs
  • 如果覺得好,可以star一下辐怕,謝謝逼蒙!當(dāng)然也歡迎提出建議,萬事起于忽微寄疏,量變引起質(zhì)變是牢!
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市赁还,隨后出現(xiàn)的幾起案子妖泄,更是在濱河造成了極大的恐慌驹沿,老刑警劉巖艘策,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異渊季,居然都是意外死亡朋蔫,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門却汉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來驯妄,“玉大人,你說我怎么就攤上這事合砂∏嗳樱” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵翩伪,是天一觀的道長(zhǎng)微猖。 經(jīng)常有香客問我,道長(zhǎng)缘屹,這世上最難降的妖魔是什么凛剥? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮轻姿,結(jié)果婚禮上犁珠,老公的妹妹穿的比我還像新娘逻炊。我一直安慰自己,他們只是感情好犁享,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布余素。 她就那樣靜靜地躺著,像睡著了一般炊昆。 火紅的嫁衣襯著肌膚如雪溺森。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天窑眯,我揣著相機(jī)與錄音屏积,去河邊找鬼。 笑死磅甩,一個(gè)胖子當(dāng)著我的面吹牛炊林,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播卷要,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼渣聚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了僧叉?” 一聲冷哼從身側(cè)響起奕枝,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瓶堕,沒想到半個(gè)月后隘道,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡郎笆,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年谭梗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宛蚓。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡激捏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出凄吏,到底是詐尸還是另有隱情远舅,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布痕钢,位于F島的核電站图柏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏盖喷。R本人自食惡果不足惜爆办,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望课梳。 院中可真熱鬧距辆,春花似錦余佃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至诸蚕,卻和暖如春步势,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背背犯。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工坏瘩, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人漠魏。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓倔矾,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親柱锹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子哪自,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容