前言

最近项目用webView有点多 有一些相关展示是第三方的H5页面
他们文档上要求集成腾讯的TBS 如果为Android接入,建议内置统一的webview版本。自带webview可能会出现机型兼容问题。可以使用 腾讯TBS服务 !

看下效果图

gif

为什么集成TBS?

X5内核相对于系统webview,具有下述明显优势:

  1. 速度快:相比系统webview的网页打开速度有30+%的提升;
  2. 省流量:使用云端优化技术使流量节省20+%;
  3. 更安全:安全问题可以在24小时内修复;
  4. 更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;
  5. 兼容好:无系统内核的碎片化问题,更少的兼容性问题;
  6. 体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;
  7. 功能全:在Html5、ES6上有更完整支持;
  8. 更强大:集成强大的视频播放器,支持视频格式远多于系统webview;
  9. 视频和文件格式的支持x5内核多于系统内核
  10. 防劫持是x5内核的一大亮点
    因此确实可以看到这个内核的优点是很多的,还有很多其它的优点,我也不一一解释了,现在我们来看看怎么做吧。笔者在做的时候也参见了很多人的博客,但是他们博客上的代码基本无法进行成功运行,因此下面这些是本人经过改进后的版本,是绝对可以进行运行的。

集成TBS流程

第一步:下载TBS SDK 腾讯浏览服务-SDK下载

第二步:将下载下来的SDK jar包复制到我们的项目工程下libs目录下

1

第三步:将jar包引入项目中

2
引入后看build.gradle 是否成功
3

代码实现

XML

<?xml version="1.0" encoding="utf-8"?>
   xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <View
        android:id="@+id/view_top"
        android:layout_width="match_parent"
        android:layout_height="24dp"
        android:background="@color/colorNavigationBar"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.appcompat.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="0dp"
        android:layout_height="@dimen/toolbar_size"
        android:background="@drawable/jianbiandi_jiayouzhan"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/view_top"
        app:navigationIcon="@drawable/login_return" />


    <com.tencent.smtt.sdk.WebView
        android:id="@+id/web_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:scrollbars="none"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toBottomOf="@id/toolbar" />

    <ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:visibility="gone"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />


</androidx.constraintlayout.widget.ConstraintLayout>

创建Application全局唯一

//初始化TBS

  @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        SharedPreferenceUtil.init(this);
        cartMap = new HashMap<>();
        initX5();
    }

    private void initX5() {
        //x5內核初始化回调
        QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
            @Override
            public void onViewInitFinished(boolean arg0) {
                //x5內核初始化完成的回调,为true表示x5内核加载成功,
                否则表示x5内核加载失败,会自动切换到系统内核。
                Log.e("app", " onViewInitFinished is ======== >>> " + arg0);
            }

            @Override
            public void onCoreInitFinished() {

            }
        };
        //x5内核初始化接口
        QbSdk.initX5Environment(getApplicationContext(), cb);
    }

是否启用X5内核 看Log打印是否回调
4

编写WebView类

com.tencent.smtt.sdk.WebView 配置和Android 自带的WebView配置一样
该类中的注释很清楚 我就直接copy代码了 有问题留言指明!谢谢

package com.fulloil_2.app.main;

import android.graphics.Bitmap;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View;
import android.view.WindowManager;
import android.widget.ProgressBar;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar;

import com.fulloil_2.app.R;
import com.fulloil_2.app.utils.ActivityUtils;
import com.fulloil_2.app.utils.StatusBarUtils;
import com.fulloil_2.app.utils.ToastUtils;
import com.tencent.smtt.sdk.CookieSyncManager;
import com.tencent.smtt.sdk.QbSdk;
import com.tencent.smtt.sdk.WebSettings;
import com.tencent.smtt.sdk.WebView;
import com.tencent.smtt.sdk.WebViewClient;

import java.util.Objects;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.Unbinder;

/**
 * @author lyudony
 * @date 2020/7/17.
 * description:
 */
public class XiaoJuWebView extends AppCompatActivity {
    private static final String TAG = "WebViewMallActivity";
    private Unbinder mUnbinder;
    @BindView(R.id.toolbar)
    Toolbar mToolbar;
    @BindView(R.id.web_view)
    com.tencent.smtt.sdk.WebView mWebView;
    @BindView(R.id.progressBar)
    ProgressBar mProgressBar;

    private String xiaojuH5Url;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_xiaoju_webview);
        StatusBarUtils.transparencyBar(this);
        mUnbinder = ButterKnife.bind(this);
        setSupportActionBar(mToolbar);
        Objects.requireNonNull(getSupportActionBar()).setDisplayShowTitleEnabled(false);
        xiaojuH5Url = (String) getIntent().getSerializableExtra(HomeFragment.EXTRA_XIAOJU_H5_URL);
        ActivityUtils.addToolbarTitle(this, mToolbar, "油站详情");
        mToolbar.setNavigationOnClickListener(v -> onBackPressed());
        //初始化腾讯的TBS
        initWebView();
        QbSdk.initX5Environment(this, null);
        String url = xiaojuH5Url;
        //启用硬件加速
        initHardwareAccelerate();
        mWebView.loadUrl(url);
        //清理缓存和历史(非必须)
        mWebView.clearCache(true);
        mWebView.clearHistory();

    }

    //启用硬件加速:由于硬件加速自身并非完美无缺,
    // 所以Android提供选项来打开或者关闭硬件加速,默认是关闭。
    // 可以在4个级别上打开或者关闭硬件加速
    private void initHardwareAccelerate() {
        try {
            if (Build.VERSION.SDK_INT >= 11) {
                //Window级别硬件加速
                getWindow()
                        .setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
                                WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
            }
        } catch (Exception e) {
        }

    }

    private void initWebView() {
        WebSettings webSettings = mWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);//支持js
        //设置可以访问文件
        mWebView.getSettings().setAllowFileAccess(true);
        //设置支持缩放
        mWebView.getSettings().setBuiltInZoomControls(true);
        mWebView.getSettings().setUseWideViewPort(true);
        mWebView.getSettings().setLoadWithOverviewMode(true);
        mWebView.getSettings().setLoadsImagesAutomatically(true); //支持自动加载图片
        mWebView.setVerticalScrollBarEnabled(false);
        mWebView.setHorizontalScrollBarEnabled(false);
        mWebView.getSettings().setAppCacheEnabled(true);
        mWebView.getSettings().setDomStorageEnabled(true);
        mWebView.getSettings().supportMultipleWindows();
        mWebView.getSettings().setAllowContentAccess(true);
        mWebView.getSettings().setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
        mWebView.getSettings().setSavePassword(true);
        mWebView.getSettings().setSaveFormData(true);
        mWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            webSettings.setMixedContentMode(android.webkit.WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
        }
//        myWebView.requestFocusFromTouch();//如果webView中需要用户手动输入用户名、密码或其他,则webview必须设置支持获取手势焦点
        webSettings.setJavaScriptCanOpenWindowsAutomatically(true); //允许js弹窗
        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public boolean shouldOverrideUrlLoading(WebView webView, String s) {
                webView.loadUrl(s);
                return true;
            }
        });

        mWebView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                mProgressBar.setVisibility(View.GONE);
            }

            @Override
            public void onPageStarted(WebView webView, String s, Bitmap bitmap) {
                super.onPageStarted(webView, s, bitmap);
                ToastUtils.showLong(XiaoJuWebView.this, "正在加载,请稍后");
                mProgressBar.setVisibility(View.VISIBLE);
            }

        });

        // 注意一定要放在WebView加载后,不然只会管理内核的缓存
        CookieSyncManager.createInstance(getApplication());
        CookieSyncManager.getInstance().sync();

    }

    //点击回退按钮不是退出应用程序,而是返回上一个页面
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //如果不做任何处理,浏览网页,点击系统“Back”键,整个Browser会调用finish()而结束自身,
        // 如果希望浏览的网 页回退而不是推出浏览器,需要在当前Activity中处理并消费掉该Back事件。
        if (keyCode == KeyEvent.KEYCODE_BACK && mWebView.canGoBack()) {
            mWebView.goBack();
            return true;
        }
        return super.onKeyDown(keyCode, event);

    }


    @Override
    protected void onResume() {
        super.onResume();
        mWebView.onResume();
    }

    @Override
    protected void onPause() {
        super.onPause();
        mWebView.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        mUnbinder.unbind();
        if (this.mWebView != null) {
            mWebView.destroy();
        }
    }

}

总结

按照以上步骤就可以轻松集成腾讯的X5内核了 加速启动webView 也可以解决
兼容性问题 提高实用性!
tips :集成第三方之前需要仔细阅读文档 避免走不必要的坑
在排错的过程中Log 排除法 真的很重要 真的很重要 真的很重要 !说三遍

共勉

我要一步一步往上爬
在最高点乘着叶片往前飞
任风吹干流过的泪和汗
我要一步一步往上爬
等待阳光静静看着它的脸
小小的天有大大的梦想
我有属于我的天
任风吹干流过的泪和汗
总有一天我有属于我的天
在这里插入图片描述

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐