腾讯X5内核的集成和使用

        这几天,由于项目中有涉及到Egret页面,导致某些机型在4.3及以下版本无法正常加载。所以就考虑到集成腾讯X5内核,替换系统自带的webview。

        关于如何集成方面,虽然X5官网 有接入指南,但个人感觉某些方面不是很详细,所以我就总结一下自己的集成步骤:

        1、首先在官网下载官方demo ,在手机上运行看看能否满足自己的需求?如果不能满足的话,我还知道有另一个项目,可以试试:Crosswalk ;

         2、仍然在X5官网,注册开发者帐号,在开发者后台申请APPkey,配置到自己的项目中;


     name不变,value改为自己的APPkey

         3、添加权限,可以直接复杂官方demo的权限。

         4、在mainActivity中加载X5内核

        @Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main_advanced);
		mContext = this;
		if (!main_initialized) {
			this.new_init();
		}
		preinitX5WebCore();
		preinitX5WithService();// 此方法必须在非主进程执行才会有效果
	}

/**
	 * 开启额外进程 服务 预加载X5内核, 此操作必须在主进程调起X5内核前进行,否则将不会实现预加载
	 */
	private void preinitX5WithService() {
		Intent intent = new Intent(mContext, FirstLoadingX5Service.class);
		startService(intent);
	}

	/**
	 * X5内核在使用preinit接口之后,对于首次安装首次加载没有效果
	 * 实际上,X5webview的preinit接口只是降低了webview的冷启动时间;
	 * 因此,现阶段要想做到首次安装首次加载X5内核,必须要让X5内核提前获取到内核的加载条件
	 */
	private void preinitX5WebCore() {
		if (!QbSdk.isTbsCoreInited()) {// preinit只需要调用一次,如果已经完成了初始化,那么就直接构造view
			QbSdk.preInit(MainActivity.this, myCallback);// 设置X5初始化完成的回调接口
															// 第三个参数为true:如果首次加载失败则继续尝试加载;
		}
	}

	private PreInitCallback myCallback = new QbSdk.PreInitCallback() {

		@Override
		public void onViewInitFinished() {// 当X5webview 初始化结束后的回调
			new WebView(mContext);
			MainActivity.this.isX5WebViewEnabled = true;
		}

		@Override
		public void onCoreInitFinished() {
		}
	};
         5、复制utils文件夹到自己的项目中,某些文件如果项目中用不到的情况下,可以删除;

         6、在项目中和使用自定义控件一样,使用X5WebView。
         7、获取控件,添加地址和js进行交互

        webView = (X5WebView) findViewById(R.id.webview);
        webView.clearCache(true);
        findViewById(R.id.progressBar).setVisibility(View.GONE);
        ((ACTTitleBannerTemplate) getTemplate()).setBannerVisibility(View.GONE);
        webView.setSaveEnabled(false);
        webView.addJavascriptInterface(new WebViewJavaScriptFunction() {

            @Override
            public void onJsFunctionCalled(String tag) {

            }

            @JavascriptInterface
            public void toastMessage(String msg) {
                //TODO
                try {
                    JSONObject jo = new JSONObject(msg);
                    String question = jo.optString("today_question");
                    if (TextUtils.isEmpty(question)) {//表明答题失败
                        Intent intent = new Intent();
                        intent.putExtra(ReadCommunityPagerPage.EXTRA_CHALLENGE_FAIL, true);
                        getActivity().setResult(Activity.RESULT_OK, intent);
                        getActivity().finish();
                    } else {
                        try {
                            question = URLDecoder.decode(question, "utf-8");
                            char[] chs = question.toCharArray();
                            StringBuilder sb = new StringBuilder();
                            for (int i = 0; i < chs.length; i++) {
                                if (i != 0 && i != chs.length - 1) {
                                    sb.append(chs[i]);
                                }
                            }
                            question = sb.toString();

                            int activityId = jo.optInt("activity_id");
                            Intent intent = new Intent(getActivity(), ReadAddDiscussRecordActivity.class);
                            intent.putExtra(ReadAddDiscussRecordPage.EXTRA_ACTIVITY_ID, activityId);
                            intent.putExtra(ReadAddDiscussRecordPage.EXTRA_TODAY_QUESTION, question);
                            getActivity().startActivity(intent);
                            getActivity().finish();
                        } catch (UnsupportedEncodingException e) {
                            e.printStackTrace();
                        }
                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, "control");
        webView.getSettings().setJavaScriptEnabled(true);
       注意:在message方法中的注解,必须使用android系统自带注解,否则无法获取到返回数据。

       推荐使用共享X5内核的jar包,一般有装QQ或者微信的情况下,使用该方法,就可以直接启用X5内核。

      App 如何首次就加载 x5 内核?

App 可以在启动后立刻调用TbsDownloader 的 public static boolean needDownload(Context context, boolean oversea) 接口,第二个参数传递 false,needDownload 内部会创建一个线程向后台查询当前可用内核版本号,这个函数内是异步执行所以不会阻塞 App 主线程,这个函数内是轻量级执行所以对 App 启动性能没有影响,当 App 后续创建 webview 时就可以首次加载 x5 内核了


  • 15
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值