1) 速度快:相比系统webview的网页打开速度有30+%的提升;
2) 省流量:使用云端优化技术使流量节省20+%;
3) 更安全:安全问题可以在24小时内修复;
4) 更稳定:经过亿级用户的使用考验,CRASH率低于0.15%;
5) 兼容好:无系统内核的碎片化问题,更少的兼容性问题;
6) 体验优:支持夜间模式、适屏排版、字体设置等浏览增强功能;
7) 功能全:在Html5、ES6上有更完整支持;
8) 更强大:集成强大的视频播放器,支持视频格式远多于系统webview;
9) 视频和文件格式的支持x5内核多于系统内核
10) 防劫持是x5内核的一大亮
<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(); }