還在用Android自帶的WebView組件?太Out了!

2021-02-13 web前端每日乾貨

為何不直接使用內置的WebView組件?

        用Android自帶的WebView組件,做過一些較複雜應用的人應該都會發現,這個自帶的組件很多時候真是讓人無力吐嘈,主要理由有二:

        Android中的WebView組件,內存洩漏的問題一直沒有非常有效的解決方案,讓程序猿們痛不欲生。

        Android中的WebView組件,在4.4以前的版本是WebKit的內核,4.4以後才換成chromium的內核,同時鑑於Google版本帝的風格,因此也導致各個版本之間的運行效率參差不齊。而且即使是chromium內核的版本,也因為要考慮兼容以前的版本,而變得不是那麼美好。

        也正因為如此,考慮到為了更好的體驗,以及避免後續可能帶來的更多麻煩,所以我試圖站在巨人的肩膀上,尋找一個第三方可靠的WebView組件。

使用方法

        第一步,下載jar包,並加載到項目中,

       下載地址:http://x5.tencent.com/doc?id=1004


        

        第二步,在xml布局中加入騰訊自定義的WebView。

        <com.tencent.smtt.sdk.WebView  

            android:id="@+id/tbsContent"  

            android:layout_width="match_parent"  

            android:layout_height="match_parent"/>

        第三步,申請騰訊X5所需權限。

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

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

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

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

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

        第四步,在Activity代碼文件中使用:

        import android.graphics.PixelFormat;

        import android.support.v7.app.ActionBarActivity;

        import android.os.Bundle;

        import android.view.KeyEvent;

        import android.view.Menu;

        import android.view.MenuItem;

        import android.view.WindowManager;

        import android.widget.LinearLayout;

        import android.widget.RelativeLayout;

        import android.widget.TextView;

        

        import com.tencent.smtt.sdk.QbSdk;

        import com.tencent.smtt.sdk.WebSettings;

        import com.tencent.smtt.sdk.WebView;

        import com.tencent.smtt.sdk.WebViewClient;

        

        

        public class MainActivity extends ActionBarActivity {

        

            com.tencent.smtt.sdk.WebView tbsContent;

            private String url = "http://www.91suke.com/s/b9271044";

        

            @Override

            protected void onCreate(Bundle savedInstanceState) {

                super.onCreate(savedInstanceState);

                setContentView(R.layout.activity_main);

        

                getWindow().setFormat(PixelFormat.TRANSLUCENT);

                getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);

                initView();

            }

        

            private void initView() {

                tbsContent = (com.tencent.smtt.sdk.WebView)findViewById(R.id.tbsContent);

                tbsContent.loadUrl(url);

                WebSettings webSettings = tbsContent.getSettings();

                webSettings.setJavaScriptEnabled(true);

                tbsContent.setWebViewClient(new WebViewClient() {

                    @Override

                    public boolean shouldOverrideUrlLoading(WebView view, String url) {

                        view.loadUrl(url);

                        return true;

                    }

                });

            }

        

            @Override

            public boolean onKeyDown(int keyCode, KeyEvent event) {

                if (keyCode == KeyEvent.KEYCODE_BACK && tbsContent.canGoBack()) {

                    tbsContent.goBack();

                    return true;

                }

                return super.onKeyDown(keyCode, event);

            }

        

            @Override

            public boolean onCreateOptionsMenu(Menu menu) {

                // Inflate the menu; this adds items to the action bar if it is present.

                getMenuInflater().inflate(R.menu.menu_main, menu);

                return true;

            }

        

            @Override

            public boolean onOptionsItemSelected(MenuItem item) {

                // Handle action bar item clicks here. The action bar will

                // automatically handle clicks on the Home/Up button, so long

                // as you specify a parent activity in AndroidManifest.xml.

                int id = item.getItemId();

        

                //noinspection SimplifiableIfStatement

                if (id == R.id.action_settings) {

                    return true;

                }

        

                return super.onOptionsItemSelected(item);

            }

        }

        


好了,到這一步,連接真機,運行你的Android程序,應該就可以看到如下效果了:


        那麼最關鍵的問題是,如何判斷已經成功接入了騰訊的X5內核瀏覽服務呢?辨別是否使用x5webview的方法:

        顯示網頁文字時,可通過長按選擇文字的標識判斷,如下水滴狀選擇效果是x5webview 的標誌:


        當然,上述的代碼僅僅只是一個簡單的測試案例,實際的生產使用環境中還有很多需要考慮的地方,例如APP切換到後臺運行的資源的釋放等等。具體的實現方式,建議大家可以參考TBS官方的示例。

 今天的乾貨就到這裡了,每天有各種乾貨等著你.各種實用的Demo等著你下載。喜歡的用戶可以長按下圖的二維碼進行關注哦.



相關焦點

  • Android最全面的 Webview 詳解
    webView.onPause();//當應用程式(存在webview)被切換到後臺時,這個方法不僅僅針對當前的webview而是全局的全應用程式的webview//它會暫停所有webview的layout,parsing,javascripttimer。降低CPU功耗。
  • Android WebView 研究筆記
    先把這個forward到本地$ adb forward tcp:5000 localabstract:webview_devtools_remote_13680看chromedriver的代碼,裡面自帶一些http接口,具體看下面的代碼https://github.com/bayandin/chromedriver/blob/33218feb63bc972c7175390ee2302fe5a2f25056
  • App自動化測試 | Android WebView測試
    WebView測試環境準備手機端PC端查看手機瀏覽器版本adb shell pm list package | grep webviewadb shell pm dump com.android.browser
  • Android Webview知識點和遇到過的坑全總結
    :name="android.permission.INTERNET" />        默認情況下,WebView不支持JavaScript,web頁面的錯誤也會被忽略,如果只是用Webview來顯示網頁而不用交互,默認配置就可以了,如果需要交互,就需要自定義配置了。
  • Android之WebView用法
    ><RelativeLayout 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
  • Android Webview使用和遇到過的坑總結
    :name="android.permission.INTERNET" />        默認情況下,WebView不支持JavaScript,web頁面的錯誤也會被忽略,如果只是用Webview來顯示網頁而不用交互,默認配置就可以了,如果需要交互,就需要自定義配置了。
  • Android WebView簡單整理
    記得第一次用webview的時候,就會個loadUrl,最近想著自己寫個簡單瀏覽器玩玩,發現了一些問題,於是寫一篇文章,文章分兩大類,一類為使用
  • 用安卓 WebView 做一個「套殼」應用
    1.3 項目配置來到項目配置頁面,分別設置好以下選項:這裡語言選擇 Java(因為我沒寫過 Kotlin 😂),而最低 SDK 則選擇了 API 23(示例用隨便選的-- 展示一個 WebView --><WebView    android:id="@+id/webview"    android:layout_width="match_parent"    android:layout_height="match_parent" />在 Android 工程中,「app
  • 【Codelab】WebView組件使用指南
    我們在config.json中添加如下代碼進行申請:module": { …… "reqPermissions": [ { "name": "ohos.permission.INTERNET" } ] }完成網絡申請後,在"MainAbilitySlice.java"文件中通過webview.load
  • Android如何獲取WebView內容高度
    ><com.trs.studyview.view.TRSScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/scrollView"
  • Android中使用WebView與JS交互全解析
    ; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.Menu; import android.view.MenuItem; import android.webkit.JavascriptInterface
  • WebView緩存原理分析和應用
    Android 5.1的目錄:/data/data/包名/cache/org.chromium.android_webview/下面,如下圖所示。但是在5.1系統上,/data/data/包名/app_webview/文件夾依然存在,只是4.4系統上面存儲WebView自帶緩存的app_webview/cache文件夾不再存在了(注意下App Cache目錄還在),如下圖所示。綜上所述,WebView自帶的瀏覽器協議支持的緩存,在不同的系統版本上,位置是不一樣的。
  • 極客學院 | 升級安卓手機WebView來提升瀏覽體驗
    Android手機中內置了一款高性能webkit內核瀏覽器,在SDK中封裝為一個叫做WebView組件。
  • Android:手把手教你構建 全面的WebView 緩存機制 & 資源加載方案
    前言由於H5具備 開發周期短、靈活性好 的特點,所以現在 Android App大多嵌入了 Android Webview 組件進行 Hybrid
  • 前端 WebView 指南之 Android 交互篇
    webview = (WebView) findViewById(R.id.webview);webview.addJavascriptInterface(new SDK(), 'sdk');webview.loadUrl('http://imnerd.org'); WebView webview = (WebView) findViewById(R.id.webView
  • Android WebView使用
    package com.example.hfs.webviewsimpledemo;    import android.support.v7.app.AppCompatActivity;importandroid.os.Bundle;import android.view.View;import android.webkit.WebChromeClient;import android.webkit.WebView;import android.webkit.WebViewClient;import android.widget.Button;
  • 乾貨|app自動化測試之Appium WebView 技術原理
    \{"name":"WEBVIEW_io.appium.android.apis"}Appium 在本地開啟了兩個 WebView 進程,進程號分別是 1271 和 26060。[debug] [AndroidDriver] Returning process name:\ 'io.appium.android.apis'Appium Server 列出通過進程查找到的所有 WebView 和可用 Context,如下:[debug] [AndroidDriver] Found webviews: ["WEBVIEW_cn.goapk.market
  • Android WebView那些坑之上傳文件
    = null) {            uploadMessage.onReceiveValue(result);            uploadMessage = null;        }    }}PS:ValueCallbacks是WebView組件通過openFileChooser()或者onShowFileChooser
  • Android爬坑之旅之WebView
    那就不得不提到我們的WebVew了,作為官方唯一用來顯示web的組件,展示網頁這樣的任務也只能交給它了。A View that displays web pages.It uses the WebKit rendering engine to display web pages and includes methods to navigate forward and backward through a history, zoom in and out, perform text searches and more.
  • Webview.apk —— Google 官方的私有插件化方案
    我們在開頭說到了 webview.apk 的更新 —— 代碼,資源都可以更新。這聽上去不就是插件化的一種嗎?Google 應用開發者無感知的情況下,到底是怎麼實現 webview 的插件化的呢?如果我們揭開了這一層神秘的面紗,我們是不是也可以用這個插件化的特性了呢?答案當然是肯定的。