一. 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内核,参考如下: (2) 该Service仅在TBS内核首次Dex加载时触发并执行dex2oat任务, 任务完成后自动结束 android:process=":dexopt" /> (3) 新建APP类继承于Application,不要忘记了在清单文件中配置; // 在调用TBS初始化、创建WebView之前进行如下配置,以开启优化方案(仅Android 5.1+生效) QbSdk.setDownloadWithoutWifi(true); 若配置了bugly sdk的异常捕获的话,则可以引入以下代码捕获异常上报的功能,此处未配置,需自行引入,防止找不到相关类 配置如下图:
|
四. 需要的权限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 硬件加速对X5视频播放非常重要,建议开启(未使用视频播放的可不用引入) --> |
五. 测试与使用
页面布局 |
---|
<com.tencent.smtt.sdk.WebView android:id="@+id/webView" |
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(); } } |
调用 |
---|