Android中WebView的使用指南:

參考文獻:
Carson_Ho的Android:這是一份全面 & 詳細的Webview使用攻略

本文知識點:

  • WebView的介紹
  • WebView的基本使用
  • WebView的一些開發(fā)中常用的API
  • WebView中一些常見的案例分析及實現(xiàn)
這里盜用Carson的一張圖片峡捡,如果覺得不妥击碗,及時告知馬上刪除

1.WebView的介紹

相信做Android的基本上都用過WebView,不論是加載網頁還是處理本地內容们拙,基本上都或多或少的使用過WebView稍途。那么WebView能為我們帶來什么呢?其實就相當于一個內置的瀏覽器砚婆,我們可以使用它完成一下操作:

1.WebView可以加載網頁
2.WebView可以加載html片段
3.WebView可以加載本地html
4.WebView與原生App進行交互
以上種種都是WebView能幫我們完成的內容械拍,所以現(xiàn)在有很多App就采用混合開發(fā)。這樣使得我們使用WebView的場景越來越多,所以這里總結一下關于WebView的一些內容坷虑。

2.WebView的基本使用

其實如果你只用WebView加載一個網頁的話甲馋,還是很好上手的∑穑基本上就三步:

  • 在AndroidManifest注冊網絡權限:這個是必須的定躏,切記切記!G鄣小痊远!
 <uses-permission android:name="android.permission.INTERNET" />
  • 加載相應的網頁資源
webView.loadUrl(url);

但是這里雖然加載的是一個url,但是你會發(fā)現(xiàn)他會直接蹦到系統(tǒng)自帶的瀏覽器中去党窜。作為強大的開發(fā)人員,怎么處理呢借宵?當然是有辦法的了幌衣。。壤玫。

  • 設置相應的本APP內打開的方法豁护;
        webView.setWebViewClient(new WebViewClient() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(String.valueOf(request.getUrl()));
                return true;
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

上面的代碼有幾點需要說明一下:

  • shouldOverrideUrlLoading(WebView view, WebResourceRequest request) 這個方法是在5.0以上的版本上使用的,而shouldOverrideUrlLoading(WebView view, String url)這個方法是在5.0以下使用的欲间,有了這兩個方法楚里,就能在自己的APP中打開相應的網頁鏈接了。猎贴。班缎。

上面就是WebView的簡單實用,基本上就是展示一個網頁她渴,沒有相應的交互問題达址。

3.WebView一些開中常用的API

加載類:

  • loadUrl(string url) 加載url地址的方法,參數就是一個Url地址趁耗;這里有一個點需要注意一下沉唠,這個方法加載的地址可以是
    • 網址 如 -> http://www.baidu.com
    • 手機本地html地址 如-> file:///android_asset/test.html
    • app包中assect目錄下的html文件 如 -> content://com.android.htmlfileprovider/sdcard/test.html
  • loadData(String data, String mimeType, String encoding) 加載html片段
    • 參數1:html片段
    • 參數2:類型
    • 參數3:編碼格式

狀態(tài)類

  • onResume() 當webView為活躍狀態(tài)的時候回調此方法(獲取焦點)
  • onPause() 切換到后臺的時候回調此方法(失去焦點)

其實上面這兩個方法是和生命周期匹配的兩個方法

  • pauseTimers() 全局范圍切換到后臺降低cpu功耗時回調的方法
  • resumeTimers() 恢復正常狀態(tài)的時候回調的方法

上面這兩個方法,是為了提高自己APP的性能的方法苛败,主要是在生命周期的方法中調用的满葛,也就是說在Activity的onResume()和onPause()中調用的(個人感覺啊。罢屈。嘀韧。)

  • destroy() 銷毀WebView的方法(主要是在音視頻的時候,在這里釋放相應的WebView缠捌,這里也是對應相應生命周期的方法的乳蛾,但是這里注意一點,在銷毀前必須先移除WebView,因為WebView會持有相應Activity的上下文引用所以這里要使用其父布局調用相應的removeView(View view)的方法進行移除)

操作網頁類

  • canGoBack() 是否可以后退
  • goBack() 回退
  • canGoForward() 是否可以前進
  • goForward() 前進網頁
  • **goBackOrForward(intsteps) ** 前進或者后退指定的位置肃叶,正數為前進/負數為后退

這里面涉及到的主要內容就是操作網頁的前進和后退蹂随,主要應用場景是什么呢?試想一下因惭,有的WebView是嵌到APP中的岳锁,一般這樣的網頁都是沒有標題的,標題的交互留給APP處理返回的問題蹦魔,就會用到上面相應的API了激率,基本上都是處理相應的返回問題

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if ((keyCode == KEYCODE_BACK) && mWb.canGoBack()) {
            mWb.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);
    }
    
    @Override
    public void onBackPressed() {
        if (mWb.canGoBack()) {
            mWb.goBack();
        } else {
            super.onBackPressed();
        }
    }

上面兩段代碼是一樣的,但是這里有一個很重要的問題需要注意一下勿决,很重要捌固伞:
有些網頁存在重定向的時候,那么canGoBack()返回的會一直是true低缩,我這里使用的是百度的鏈接嘉冒,因為百度重定向了,所以一直返回的是true咆繁,如果這里要是自己公司開發(fā)的Url的話讳推,應該不會出現(xiàn)這種情況!這里提供一種解決辦法

    @Override
    public void goBack() {
        WebBackForwardList mWebBackForwardList = copyBackForwardList();
        // 判斷當前歷史列表是否最頂端,其實canGoBack已經判斷過
        if (mWebBackForwardList.getCurrentIndex() > 0) {
            // 獲取歷史列表
            String historyUrl = mWebBackForwardList.getItemAtIndex(
                    mWebBackForwardList.getCurrentIndex() - 1).getUrl();
            if (historyUrl.equals("https://www.baidu.com/")) {
                //回到首頁了
                Activity activity = (Activity) mContext;
                activity.finish();
            }
        }
        super.goBack();
    }

上面的代碼就是拷貝出所有前進的頁面玩般,然后判斷因為這里重定向了银觅,所以你getUrl()獲取的網址永遠是重定向那個,所以這里我就想直接把網址寫死的話就能處理了坏为,但是我覺得我的解決辦法比較笨究驴,還請大神們指教!T确纳胧!

緩存類

  • clearCache(true) 清除WebView產生的所有緩存
  • clearHistory() 清除當前WebView訪問的歷史數據
  • clearFormData() 清除表單數據

WebSettings類

這個類是對WebView進行管理和設置的

  • getSettings() 獲取WebSettings的
  • setJavaScriptEnabled(boolean flag); 是否可以和js進行交互
  • setPluginState(PluginState state) 是否支持插件,這里面?zhèn)鬟f的是一個枚舉對象
    • WebSettings.PluginState.OFF 不支持
    • WebSettings.PluginState.ON 支持
  • setUseWideViewPort(boolean use) 是否將圖片調整到WebView的大小
  • setLoadWithOverviewMode(boolean overview) 是否將WebView調整到屏幕大小

上面兩個API一起使用帘撰!切記跑慕,因為只有這樣才能讓界面看上去不那么丑!

  • setSupportZoom(boolean support)支持縮放摧找,默認為true核行。是下面這個API的前提。

  • setBuiltInZoomControls(boolean enabled) 設置內置的縮放控件蹬耘。若為false芝雪,則該WebView不可縮放

  • setDisplayZoomControls(boolean enabled) 隱藏原生的縮放控件,這里可以自己在頁面中實現(xiàn)综苔。

  • setCacheMode(@CacheMode int mode) 設置緩存的模式

    • WebSettings.LOAD_DEFAULT 默認的模式 根據cache-control決定是否從網絡上取數據惩系。
    • WebSettings.LOAD_CACHE_ELSE_NETWORK 只要本地有位岔,無論是否過期,或者no-cache堡牡,都使用緩存中的數據
    • WebSettings.LOAD_NO_CACHE 不使用緩存
    • WebSettings.LOAD_CACHE_ONLY 不使用網絡抒抬,只加載緩存
  • setAllowFileAccess(boolean allow) 設置可以訪問app中assect中的文件

  • setJavaScriptCanOpenWindowsAutomatically(boolean flag) 支持通過JS打開新窗口

  • setLoadsImagesAutomatically(boolean flag) 支持自動加載圖片

  • setDefaultTextEncodingName(String encoding) 設置編碼格式

  • setRenderPriority(RenderPriority priority) 設置渲染的優(yōu)先級,這里傳入的是一個枚舉

    • NORMAL 正常
    • HIGH 高
    • LOW 低

WebViewClient類

處理各種通知和請求事件的控制類

  • shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
  • shouldOverrideUrlLoading(WebView view, String url)

下面這個方法已經過時了晤柄,最新的是上面的那個方法擦剑,對于相應的url可以通過WebResourceRequest進行獲取。重寫這兩個方法自己處理的話芥颈,可以不使用相應的瀏覽器進行打開惠勒,在本APP中打開,這也是一開始的時候為什么要重寫這個方法爬坑。

  • onPageStarted(WebView view, String url, Bitmap favicon) 加載WebView開始的時候回調的方法纠屋,一般都在這里添加相應的Loadding,與用戶交互盾计,告訴用戶頁面還沒有加載完成售担;
  • onPageFinished(WebView view, String url) WebView加載完成的時候回調的方法和上面那個方法是相呼應的,可以在這里關閉相應的對話框闯估!

這里有一個問題注意一下灼舍,還是重定向的問題吼和。如果這個網頁重定向了涨薪,那么上面這兩個方法會被多次調用!

  • onLoadResource(WebView view, String url) 這個方法會在每次加載資源的時候回調炫乓,如果圖片很多的話刚夺,會被調用多次。后面這個url代表的是相應加載的地址末捣。

  • onReceivedError(WebView view, int errorCode,String description, String failingUrl)

  • onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)

上面這個方法已經過時了侠姑,可以根據相應的code進行判斷。后面這個方法主要是通過WebResourceError的錯誤編碼進行相應的判斷箩做,處理相應的錯誤莽红!這個方法的主要作用是加載錯誤的回調。

  • onReceivedError(WebView view, int errorCode,String description, String failingUrl)
  • onReceivedError(WebView view, WebResourceRequest request, WebResourceError error)

這兩個方法是處理相應的https的網絡請求的(webView默認是不處理https請求的邦邦,頁面會顯示空白安吁,使用如上面的方法進行處理)

            @Override
            public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
                super.onReceivedSslError(view, handler, error);
                handler.proceed();
            }

            // 特別注意:5.1以上默認禁止了https和http混用,以下方式是開啟
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                mWebView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
            }

WebChromeClient類

如果你對控制類沒有那么多要求的話燃辖,使用上面的控制類就可以了鬼店,但是如果你要求比較高的話,就要用到下面這個控制類了

  • onProgressChanged(WebView view, int newProgress) 這個回調會實時的返回網頁加載的總進度黔龟,最大值是100妇智,可以根據當前值顯示進度滥玷。
  • onReceivedTitle(WebView view, String title) 獲取當前加載網頁的標題
  • onJsAlert(WebView view, String url, String message, JsResult result) 如果這里返回true,那么js中彈出的警告對話框就由客戶端處理巍棱;
  • onJsAlert(WebView view, String url, String message, JsResult result) 如果這里返回true惑畴,那么js中彈出的確認對話框就由客戶端處理;
  • **onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) ** 如果這里返回true拉盾,那么js中彈出的提示對話框將由客戶端進行處理桨菜。

4.WebView中一些常見的案例分析及實現(xiàn)

WebView顯示進度

由很多APP中由都嵌入WebView,不知道大家仔細看過沒有捉偏,有的WebView在加載的時候頂部由一個進度條倒得,提示用戶加載的進度,其實很好實現(xiàn)夭禽,這里就帶大家實現(xiàn)一下:

效果圖
  • 頁面搭建
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.demo.MainActivity">

    <ProgressBar
        android:id="@+id/pb_progress"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="5dp"
        android:background="@drawable/progress_bg" />

    <WebView
        android:id="@+id/wb"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

這里就不講解ProgressBar實現(xiàn)水平進度條了霞掺,百度一大堆!!!

  • 代碼實現(xiàn)
    private java.lang.String mUrl = "https://www.baidu.com/";
    private WebView mWb;
    private ProgressBar progressBar;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWb = findViewById(R.id.wb);

        progressBar = findViewById(R.id.pb_progress);
        progressBar.setMax(100);

        setWebView(mWb);
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void setWebView(WebView wb) {
        WebSettings settings = wb.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setPluginState(WebSettings.PluginState.ON);
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setSupportZoom(true);

        wb.loadUrl(mUrl);
        wb.setWebViewClient(new WebViewClient() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(String.valueOf(request.getUrl()));
                return true;
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }
        });

        wb.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                progressBar.setProgress(newProgress);
            }
        });
    }

主要代碼就這么多就能,這里設置了一些其他的屬性讹躯,上面都講解了菩彬,這里就不去說了。潮梯。骗灶。

WebView加載錯誤顯示缺省頁面

private java.lang.String mUrl = "https://google.com/";
    private WebView mWb;
    private ProgressBar progressBar;
    private java.lang.String mErrorUrl = "file:///android_asset/test.html";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mWb = findViewById(R.id.wb);

        progressBar = findViewById(R.id.pb_progress);
        progressBar.setMax(100);

        setWebView(mWb);
    }

    @SuppressLint("SetJavaScriptEnabled")
    private void setWebView(WebView wb) {
        WebSettings settings = wb.getSettings();
        settings.setJavaScriptEnabled(true);
        settings.setPluginState(WebSettings.PluginState.ON);
        settings.setUseWideViewPort(true);
        settings.setLoadWithOverviewMode(true);
        settings.setSupportZoom(true);

        wb.loadUrl(mUrl);
        wb.setWebViewClient(new WebViewClient() {
            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
                view.loadUrl(String.valueOf(request.getUrl()));
                return true;
            }

            @Override
            public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
            }

            @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
            @Override
            public void onReceivedHttpError(WebView view, WebResourceRequest request, WebResourceResponse errorResponse) {
                super.onReceivedHttpError(view, request, errorResponse);
                // 這個方法在6.0才出現(xiàn)
                int statusCode = errorResponse.getStatusCode();
                System.out.println("onReceivedHttpError code = " + statusCode);
                if (404 == statusCode || 500 == statusCode) {
                    view.loadUrl("about:blank");// 避免出現(xiàn)默認的錯誤界面
                    view.loadUrl(mErrorUrl);
                }
            }

            @RequiresApi(api = Build.VERSION_CODES.M)
            @Override
            public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
                super.onReceivedError(view, request, error);
                // 斷網或者網絡連接超時
                if (error.getErrorCode() == ERROR_HOST_LOOKUP || error.getErrorCode() == ERROR_CONNECT || error.getErrorCode() == ERROR_TIMEOUT) {
                    view.loadUrl("about:blank"); // 避免出現(xiàn)默認的錯誤界面
                    view.loadUrl(mErrorUrl);
                }
            }

            @Override
            public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) {
                super.onReceivedError(view, errorCode, description, failingUrl);
                // 斷網或者網絡連接超時
                if (errorCode == ERROR_HOST_LOOKUP || errorCode == ERROR_CONNECT || errorCode == ERROR_TIMEOUT) {
                    view.loadUrl("about:blank"); // 避免出現(xiàn)默認的錯誤界面
                    view.loadUrl(mErrorUrl);
                }
            }
        });

        wb.setWebChromeClient(new WebChromeClient() {
            @Override
            public void onProgressChanged(WebView view, int newProgress) {
                super.onProgressChanged(view, newProgress);
                Log.e("done", "onProgressChanged: " + newProgress);
                progressBar.setProgress(newProgress);
            }

            @Override
            public void onReceivedTitle(WebView view, String title) {
                super.onReceivedTitle(view, title);
                // android 6.0 以下通過title獲取
                if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
                    if (title.contains("404") || title.contains("500") || title.contains("Error")) {
                        view.loadUrl("about:blank");// 避免出現(xiàn)默認的錯誤界面
                        view.loadUrl(mErrorUrl);
                    }
                }
            }
        });
    }

因為WebView引起了google的重視忿族,所以版本之間存在很多差異刻炒,所以這里區(qū)分了很多版本的問題,上面都有相應的注解找都!其實就是在斷網或者網絡重連的時候添加了相應的錯誤頁面萝究,防止用戶看見那個難看的斷網頁面免都。增加用戶的體驗!

WebView與JS交互的實現(xiàn)

這里先貼一段測試的js代碼帆竹,下面會用到:

<html>
<head>
    <meta charset="utf-8">
    <title>App調用js的代碼</title>

    <script>
    // Android需要調用的方法
    function callJS(){
       console.log("你看我在哪出來~~~");
    }
    function callAndroid(){
       // 由于對象映射绕娘,所以調用test對象等于調用Android映射的對象
       test.hello("js調用了android中的hello方法");
    }
    </script>
</head>
<body>
<h1>假裝這個一個頁面</h1>
<button type="button" id="button1" onclick="callAndroid()"></button>
</body>
</html>

1. 原生代碼調用js中的代碼

這里可以有兩種實現(xiàn)方案:
這里注意一點,無論使用那種方案調用栽连,前提是一定要有下面的代碼O樟臁!秒紧!

        WebSettings settings = mWb.getSettings();
        settings.setJavaScriptEnabled(true);//允許相應js代碼
  • 通過loadUrl("javascript:callJS()")調用js中的代碼绢陌,但是會刷新相應的頁面(這里面callJS是上面function的方法名稱)

  • 通過evaluateJavascript(String script, ValueCallback<String> resultCallback)的callBack進行調用相應的方法(這個處理效率高,但是這個方法是在API19才可以使用的噩茄,所以一般在使用的時候通過判斷版本兩個一起使用O旅妗!<ㄆ浮)

整體的使用代碼如下:

        if (Build.VERSION.SDK_INT > 18) {
            mWb.evaluateJavascript("javascript:callJS()", new ValueCallback<String>() {
                @Override
                public void onReceiveValue(String value) {
                    Log.e("done", "onReceiveValue: " + value);
                }
            });
        } else {
            mWb.loadUrl("javascript:callJS()");
        }

這樣既解決了效率的問題也解決了版本的問題沥割。

2. 原生代碼調用js中的代碼

這里最常用的方式就是通過注釋@JavascriptInterface進行調用耗啦,但是看了Carson_Ho的文章說這里有漏洞,但是說4.2就沒有這種漏洞了机杜,所以沒有去研究帜讲,感覺現(xiàn)在一般的手機都應該超過4.2了,如果以后需要適配的時候在仔細看一下=忿帧K平!

  • 步驟1:
    創(chuàng)建一個類用于給JS提供相應的方法蚀苛;
    class JSMothod {
        @JavascriptInterface
        public void hello(String msg) {
            System.out.println("JS調用了Android的hello方法");
        }
    }

這里有一點需要注意的在验,就是@JavascriptInterface這個注解一定要加上,否則對于4.0一下的手機可能會存在問題6挛础R干唷!切記渗蟹。块饺。。

  • 步驟2:
    添加相應的調用方法
addJavascriptInterface(Object object, String name);

這里面的兩個參數分別是上面寫的那個類對象和相應js中的方法名雌芽;具體的代碼是這樣的授艰。。世落。

mWb.addJavascriptInterface(new JSMothod(),"test");

這樣就能實現(xiàn)js調用Android的代碼了淮腾,其實很簡單。


基本上上面的內容就囊括了Android在使用WebView中的一些常見的使用場景岛心,可能還有些內容沒有想到来破,如果有什么不明白的篮灼,可以在下方給我留言,還希望這些內容可以幫到你W缬铡!娘荡!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市炮沐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌大年,老刑警劉巖玉雾,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轻要,死亡現(xiàn)場離奇詭異复旬,居然都是意外死亡,警方通過查閱死者的電腦和手機冲泥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門驹碍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人凡恍,你說我怎么就攤上這事志秃。” “怎么了嚼酝?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵洽损,是天一觀的道長。 經常有香客問我革半,道長碑定,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任又官,我火速辦了婚禮延刘,結果婚禮上,老公的妹妹穿的比我還像新娘六敬。我一直安慰自己碘赖,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布外构。 她就那樣靜靜地躺著普泡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪审编。 梳的紋絲不亂的頭發(fā)上撼班,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音垒酬,去河邊找鬼砰嘁。 笑死,一個胖子當著我的面吹牛勘究,可吹牛的內容都是我干的矮湘。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼口糕,長吁一口氣:“原來是場噩夢啊……” “哼缅阳!你這毒婦竟也來了?” 一聲冷哼從身側響起景描,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤孤里,失蹤者是張志新(化名)和其女友劉穎捌袜,沒想到半個月后炸枣,有當地人在樹林里發(fā)現(xiàn)了一具尸體适肠,經...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡侯养,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年逛揩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惧笛。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡患整,死狀恐怖喷众,靈堂內的尸體忽然破棺而出到千,到底是詐尸還是另有隱情,我是刑警寧澤父阻,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布加矛,位于F島的核電站斟览,受9級特大地震影響辑奈,放射性物質發(fā)生泄漏已烤。R本人自食惡果不足惜胯究,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一躁绸、第九天 我趴在偏房一處隱蔽的房頂上張望净刮。 院中可真熱鬧,春花似錦株婴、人聲如沸暑认。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽八回。三九已至驾诈,卻和暖如春乍迄,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褥伴。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工重慢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逊躁,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓囚戚,卻偏偏與公主長得像轧简,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子庐橙,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內容

  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    南城的人閱讀 4,749評論 0 19
  • 前言 總結 Android WebView 常用的相關知識點,令包含以下干貨內容分析:Js注入漏洞恶导、WebView...
    無名小子的雜貨鋪閱讀 69,804評論 17 169
  • WebView·開車指南 目錄 WebView簡介 WebView基本使用 WebView常用方法 WebSett...
    小莊bb閱讀 3,499評論 3 25
  • Tips 由于WebView的用法實在太多邦泄,如果您只是想查詢某個功能的使用——建議Ctrl+F(Commad+F)...
    BugDev閱讀 7,746評論 11 109
  • WebView簡介 String getUrl():獲取當前頁面的URL顺囊。 reload():重新reload當前...
    QM閱讀 3,104評論 0 52