您的位置:首页 > 移动开发 > Android开发

腾讯X5内核的集成和使用

2016-06-28 11:54 811 查看
        这几天,由于项目中有涉及到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 内核了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android