TBS(腾讯浏览器服务)

TBS介绍:
正如官网所言,依托 X5 内核强大的能力,TBS 致力于提供优化移动端浏览体验的整套解决方案。TBS 虽然核心在于提供一套 SDK 解决传统 WebView 的诸多使用问题。但是,利用其增强浏览能力,我们还能够使用这套 SDK 实现应用内的文件浏览功能、视频播放功能等。更多详细功能,可以参考官网介绍:https://x5.tencent.com/tbs/index.html
TBS WebView的优势:

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

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

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

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

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

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

7) 功能全:在Html5ES6上有更完整支持;

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

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

10) 防劫持是x5内核的一大亮

TBS的使用:
1)下载SDK放入libs文件夹中,然后右键,点击add as library,接下来就可以编写代码了,TBS中的webView她只是对原生的WebView进行了聚合的包装,所以在使用起来根原生WebVIew
差不多。
2)在XML布局声明中使用:

<com.tencent.smtt.sdk.WebView

android:id="@+id/forum_context"

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:paddingLeft="5dp"

android:paddingRight="5dp" />

3)添加使用的到的权限

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

4)

App 在启动后(例如在 Application onCreate 中)立刻调用 QbSdk 的预加载接口 initX5Environment 

事例代码:
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {

    @Override
    public void onViewInitFinished(boolean arg0) {
        // TODO Auto-generated method stub
        //x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
        Log.d("app", " onViewInitFinished is " + arg0);
    }

    @Override
    public void onCoreInitFinished() {
        // TODO Auto-generated method stub
    }
};
//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(),  cb);
5)在activity或fragment中使用
private void init() {
    mWebView = new X5WebView(this, null);
    mViewParent.addView(mWebView, new FrameLayout.LayoutParams(
            FrameLayout.LayoutParams.FILL_PARENT,
            FrameLayout.LayoutParams.FILL_PARENT));
    initProgressBar();
    mWebView.setWebViewClient(new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return false;
        }

        @Override
        public void onPageFinished(WebView view, String url) {
            super.onPageFinished(view, url);
            // mTestHandler.sendEmptyMessage(MSG_OPEN_TEST_URL);
            mTestHandler.sendEmptyMessageDelayed(MSG_OPEN_TEST_URL, 5000);// 5s?
            if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 16)
                changGoForwardButton(view);
/* mWebView.showLog("test Log"); */
        }
    });

    mWebView.setWebChromeClient(new WebChromeClient() {

        @Override
        public boolean onJsConfirm(WebView arg0, String arg1, String arg2,
                                   JsResult arg3) {
            return super.onJsConfirm(arg0, arg1, arg2, arg3);
        }
        View myVideoView;
        View myNormalView;
        CustomViewCallback callback;
        /**
         * 全屏播放配置
         */
        @Override
        public void onShowCustomView(View view,
                                     CustomViewCallback customViewCallback) {
            /*FrameLayout normalView = (FrameLayout) findViewById(R.id.web_filechooser);
            ViewGroup viewGroup = (ViewGroup) normalView.getParent();
            viewGroup.removeView(normalView);
            viewGroup.addView(view);
            myVideoView = view;
            myNormalView = normalView;
            callback = customViewCallback;*/
        }

        @Override
        public void onHideCustomView() {
            if (callback != null) {
                callback.onCustomViewHidden();
                callback = null;
            }
            if (myVideoView != null) {
                ViewGroup viewGroup = (ViewGroup) myVideoView.getParent();
                viewGroup.removeView(myVideoView);
                viewGroup.addView(myNormalView);
            }
        }

        @Override
        public boolean onJsAlert(WebView arg0, String arg1, String arg2,
                                 JsResult arg3) {
            /**
             * 这里写入你自定义的window alert
             */
            return super.onJsAlert(null, arg1, arg2, arg3);
        }
    });

    mWebView.setDownloadListener(new DownloadListener() {

        @Override
        public void onDownloadStart(String arg0, String arg1, String arg2,
                                    String arg3, long arg4) {
            TbsLog.d(TAG, "url: " + arg0);
            new AlertDialog.Builder(BrowserActivity.this)
                    .setTitle("allow to download?")
                    .setPositiveButton("yes",
                            new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog,
                                                    int which) {
                                    Toast.makeText(
                                            BrowserActivity.this,
                                            "fake message: i'll download...",
                                            Toast.LENGTH_SHORT).show();
                                }
                            })
                    .setNegativeButton("no",
                            new DialogInterface.OnClickListener() {

                                @Override
                                public void onClick(DialogInterface dialog,
                                                    int which) {
                                    // TODO Auto-generated method stub
                                    Toast.makeText(
                                            BrowserActivity.this,
                                            "fake message: refuse download...",
                                            Toast.LENGTH_SHORT).show();
                                }
                            })
                    .setOnCancelListener(
                            new DialogInterface.OnCancelListener() {

                                @Override
                                public void onCancel(DialogInterface dialog) {
                                    // TODO Auto-generated method stub
                                    Toast.makeText(
                                            BrowserActivity.this,
                                            "fake message: refuse download...",
                                            Toast.LENGTH_SHORT).show();
                                }
                            }).show();
        }
    });

    WebSettings webSetting = mWebView.getSettings();
    webSetting.setAllowFileAccess(true);
    webSetting.setLayoutAlgorithm(LayoutAlgorithm.NARROW_COLUMNS);
    webSetting.setSupportZoom(true);
    webSetting.setBuiltInZoomControls(true);
    webSetting.setUseWideViewPort(true);
    webSetting.setSupportMultipleWindows(false);
    // webSetting.setLoadWithOverviewMode(true);
    webSetting.setAppCacheEnabled(true);
    // webSetting.setDatabaseEnabled(true);
    webSetting.setDomStorageEnabled(true);
    webSetting.setJavaScriptEnabled(true);
    webSetting.setGeolocationEnabled(true);
    webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
    webSetting.setAppCachePath(this.getDir("appcache", 0).getPath());
    webSetting.setDatabasePath(this.getDir("databases", 0).getPath());
    webSetting.setGeolocationDatabasePath(this.getDir("geolocation", 0)
            .getPath());
    // webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
    webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
    // webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
    // webSetting.setPreFectch(true);
    long time = System.currentTimeMillis();
    if (mIntentUrl == null) {
        mWebView.loadUrl(mHomeUrl);
    } else {
        mWebView.loadUrl(mIntentUrl.toString());
    }
    TbsLog.d("time-cost", "cost time: "
            + (System.currentTimeMillis() - time));
    CookieSyncManager.createInstance(this);
    CookieSyncManager.getInstance().sync();
    Button button = findViewById(R.id.javacalljs1);
    Button button1 = findViewById(R.id.javacalljs2);
    button.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            mWebView.loadUrl("javascript:javaCallJsNoArgs()");
        }
    });
    button1.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View view) {
            mWebView.loadUrl("javascript:javaCallJsExistArgs(" + "'http://blog.csdn.net/Leejizhou'"+")");
        }
    });
    //js调用javaobject 表示 Js 访问的接口内容所在的 Java 对象;name 表示 Js 调用 Java 代码时的接口名称,与 Js 中的调用保持一致即可。
    mWebView.addJavascriptInterface(this, "niejian_android");
    mWebView.addJavascriptInterface(this,"niejian_android");

}

//提供给 Js 访问的属性和方法必须定义为 public 类型,并且添加注解 @JavascriptInterface。在 API 17 及更高版本的系统中,任何暴露给 Js 访问的 Java 接口都需要添加这个注解,否则会报异常:Uncaught TypeError: Object [object Object] has no method 'XXX'。系统这种做法也是为了降低应用的安全隐患,因为在之前的版本中,Js 可以通过反射的方式访问注入 WebView 中的 Java 对象的 public 类型 field 和 method,从而随意修改宿主程序。
@JavascriptInterface
public void javaCallJsMethod1(){
    Toast.makeText(getApplicationContext(),"js调用java代码",Toast.LENGTH_SHORT).show();
}

@JavascriptInterface
public void javaCallJsMethod2(String name){
    Log.i("js调用java的有参数方法","js调用java的有参数方法"+name);
    Toast.makeText(getApplicationContext(),"js调用java的有参数方法"+name,Toast.LENGTH_SHORT).show();
}

具体代码下载请移步:https://gitee.com/yangzelin/TBSWebView.git




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值