腾讯X5内核浏览器的使用

时间:2024-03-16 18:16:27

一. X5优势介绍

(1) 速度快:相比系统WebView的网页打开速度有30+%的提升;

(2) 省流量:使用云端优化技术使流量节省20+%;

(3) 更安全:安全问题可以在24小时内修复;

(4) 更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;

(5) 兼容好:无系统内核的碎片化问题,更少的兼容性问题;

(6) 体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;

(7) 功能全:在HTML5、ES6上有更完整支持;

(8) 更强大:集成强大的视频播放器,支持视频格式远多于系统WebView

(9) 视频和文件格式的支持X5内核多于系统内核

(10) 防劫持是X5内核的一大亮点

二. 资源的下载,并导入X5内核的Jar包到libs目录下

       (1)  http://x5.tencent.com/tbs/sdk.html (官方下载地址,拥有最新版的)

       (2)  链接: https://pan.baidu.com/s/1CCfG4-LMP76ftSj4WfPMvQ

              密码: gifn

三. X5的相关配置

   (1)  X5暂时不提供64位so文件,为了保证64位手机能正常加载X5内核,参考如下:

腾讯X5内核浏览器的使用

   (2)  该Service仅在TBS内核首次Dex加载时触发并执行dex2oat任务, 任务完成后自动结束
         <service
                  android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
                  android:label="dexopt"

                  android:process=":dexopt" />

   (3)  新建APP类继承于Application,不要忘记了在清单文件中配置;

         // 在调用TBS初始化、创建WebView之前进行如下配置,以开启优化方案(仅Android 5.1+生效)
        HashMap<String, Object> map = new HashMap<>();
        map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
        QbSdk.initTbsSettings(map);
        // x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(), null);
        // 非wifi网络条件下是否允许下载内核,默认为false(针对用户没有安装微信/手Q/QQ空间[无内核]的情况下)

        QbSdk.setDownloadWithoutWifi(true);


        若配置了bugly sdk的异常捕获的话,则可以引入以下代码捕获异常上报的功能,此处未配置,需自行引入,防止找不到相关类

        配置如下图:

腾讯X5内核浏览器的使用


腾讯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" />

      <!-- 硬件加速对X5视频播放非常重要,建议开启(未使用视频播放的可不用引入) -->
      <uses-permission android:name="android.permission.GET_TASKS" />

五. 测试与使用

    页面布局

   <com.tencent.smtt.sdk.WebView

             android:id="@+id/webView"
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:scrollbars="none" />

    Activity代码
public class WebActivity extends AppCompatActivity {

    private WebView mWebView;
    private final static int SDK_INT = 11;
    public final static String PARAM_TITLE = "param_title";
    public final static String PARAM_URL = "param_url";

    @SuppressLint("SetJavaScriptEnabled")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().setFormat(PixelFormat.TRANSLUCENT);
        try {
            if (Build.VERSION.SDK_INT >= SDK_INT) {
                getWindow().setFlags(android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                        android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
            }
        } catch (Exception e) {
        }
        Intent intent = getIntent();
        String title = intent.getStringExtra(WebActivity.PARAM_TITLE);
        String url = intent.getStringExtra(WebActivity.PARAM_URL);
        setContentView(R.layout.activity_web);

        mWebView = findViewById(R.id.webView);
        // init webView settings
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true);
        webSettings.setDefaultTextEncodingName("UTF-8");
        webSettings.setRenderPriority(WebSettings.RenderPriority.HIGH);
        // 图片过大时自动适应屏幕
        webSettings.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NORMAL);
        // 禁用水平垂直滚动条
        mWebView.setHorizontalScrollBarEnabled(false);
        mWebView.setVerticalScrollBarEnabled(false);
        webSettings.setAllowFileAccess(true);
        webSettings.setAllowContentAccess(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setSavePassword(false);
        webSettings.setSaveFormData(false);
        webSettings.setSupportMultipleWindows(true);
        webSettings.setPluginState(WebSettings.PluginState.ON_DEMAND);
        // 设置加载进来的页面自适应手机屏幕
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        // (禁止)显示放大缩小Controller
        webSettings.setBuiltInZoomControls(false);
        // (禁止)|(可)缩放
        webSettings.setSupportZoom(false);
        // 不显示webView缩放按钮
        webSettings.setDisplayZoomControls(false);
        webSettings.setCacheMode(WebSettings.LOAD_NO_CACHE);
        // 调整Cookie的使用,否则Cookie的相关操作只能影响系统内核
        CookieSyncManager.createInstance(this);
        CookieSyncManager.getInstance().sync();
        // 异常捕获的设置,未配置可先不引入
        CrashReport.WebViewInterface x5WebView = new CrashReport.WebViewInterface() {

            /**
             * 获取WebView URL
             * @return 返回URL
             */
            @Override
            public String getUrl() {
                return mWebView.getUrl();
            }

            /**
             * 开启JavaScript
             *
             * @param flag true表示开启;false表示关闭
             */
            @Override
            public void setJavaScriptEnabled(boolean flag) {
                WebSettings webSettings = mWebView.getSettings();
                webSettings.setJavaScriptEnabled(flag);
            }

            /**
             * 加载URL
             *
             * @param url 要加载的URL
             */
            @Override
            public void loadUrl(String url) {
                mWebView.loadUrl(url);
            }

            /**
             * 添加JavaScript接口对象
             *
             * @param jsInterface JavaScript接口对象
             * @param name JavaScript接口对象名称
             */
            @Override
            public void addJavascriptInterface(H5JavaScriptInterface jsInterface, String name) {
                mWebView.addJavascriptInterface(jsInterface, name);
            }

            /**
             * 获取WebView的内容描述
             *
             * @return WebView的内容描述
             */
            @Override
            public CharSequence getContentDescription() {
                return mWebView.getContentDescription();
            }
        };
        mWebView.setWebViewClient(new WebViewClient() {

            @Override
            public void onPageStarted(WebView webView, String url, Bitmap bitmap) {
                super.onPageStarted(webView, url, bitmap);
            }

            @Override
            public void onPageFinished(WebView webView, String url) {
                super.onPageFinished(webView, url);
            }

            @Override
            public void onReceivedSslError(WebView webView, SslErrorHandler sslErrorHandler, SslError sslError) {
                // 接受所有网站的证书
                sslErrorHandler.proceed();
                super.onReceivedSslError(webView, sslErrorHandler, sslError);
            }
        });
        mWebView.setWebChromeClient(new WebChromeClient() {

            @Override
            public void onProgressChanged(WebView webView, int newProgress) {
                // 对x5浏览器增加Javascript异常监控
                CrashReport.setJavascriptMonitor(x5WebView, true);
                super.onProgressChanged(webView, newProgress);
            }

            @Override
            public void onReceivedTitle(WebView webView, String titles) {
                super.onReceivedTitle(webView, titles);
            }
        });
        // 禁用页面的长按事件(代替长按不出现复制功能)
        mWebView.setOnLongClickListener(new View.OnLongClickListener() {

            @Override
            public boolean onLongClick(View v) {
                return true;
            }
        });
        mWebView.addJavascriptInterface(this, "jsObj");
        mWebView.loadUrl(url);
    }

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

    @Override
    protected void onDestroy() {
        if (null != mWebView) {
            // 销毁webView
            mWebView.destroy();
            mWebView = null;
        }
        super.onDestroy();
    }
}
    调用
腾讯X5内核浏览器的使用
Run ok!!!