Android使用Hybrid框架VasSonic教程

JAVA herman 1965浏览 0评论
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

类似于小程序这样的功能,腾讯尝试了很多方式来提高打开速度。包括冷热启动多进程、多线程并行、减冗余JS插件、预加载、webview复用、反射、素材校验、进程冗余启动流程、redex等,一步步走了一年多最终完善到sonic。根据 sonic 的测试对比,我们发现采用sonic的结构确实在打开H5首屏效率上提升了不少。本文将详细的讲解使用Android设备配合sonic开发的示例教程。

Sonic 专注于提升H5首屏加载速度

采用 VasSonic 我们首先需要做的是,下载 VasSonic 的SDK

在您的模块的build.gradle中添加VasSonic gradle插件作为依赖。

compile 'com.tencent.sonic:sdk:1.0.0'

实现声音界面

实现一个扩展的类 SonicRuntime。

SonicRuntime是与系统中整体运行信息进行交互的类,包括Context,UA,ID(这是保存数据的唯一标识)和其他信息。

/**
* 下面是SonicRuntime的样本子类
*/
public class HostSonicRuntime extends SonicRuntime {
    public HostSonicRuntime(Context context) {
        super(context);
    }
    /**
     * @return 返回用户UA 
     */
    @Override
    public String getUserAgent() {
        return "";
    }
    /**
     * @return 返回用户的ID。
     */
    @Override
    public String getCurrentUserAccount() {
        return "";
    }
    /**
     * @return 返回用于保存Sonic缓存的文件路径。
     */
    @Override
    public File getSonicCacheDir() {
        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "sonic/";
        File file = new File(path.trim());
        if(!file.exists()){
            file.mkdir();
        }
        return file;
    }
}

实现一个扩展的子类 SonicSessionClient。

/**
 * SonicSessionClient是一个精简的API类,将其公共API委托给后端WebView类实例,如loadUrl和loadDataWithBaseUrl。
 */
public class SonicSessionClientImpl extends SonicSessionClient {
    private WebView webView;
    public void bindWebView(WebView webView) {
        this.webView = webView;
    }
    @Override
    public void loadUrl(String url, Bundle extraData) {
        webView.loadUrl(url);
    }
    @Override
    public void loadDataWithBaseUrl(String baseUrl, 
		String data, String mimeType, 
		String encoding,String historyUrl) {
        webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);
    }
}

Android示例

这是一个简单的演示,演示如何创建一个使用VasSonic框架的Android活动。

public class BrowserActivity extends Activity {
    public final static String PARAM_URL = "param_url";
    public final static String PARAM_MODE = "param_mode";
    private SonicSession sonicSession;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Intent intent = getIntent();
        String url = intent.getStringExtra(PARAM_URL);
        int mode = intent.getIntExtra(PARAM_MODE, -1);
        if (TextUtils.isEmpty(url) || -1 == mode) {
            finish();
            return;
        }
        getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
        //步骤1:如有必要初始化声音引擎,或者也许当应用程序创建u能做到这一点
        if (!SonicEngine.isGetInstanceAllowed()) {
            SonicEngine.createInstance(new SonicRuntimeImpl(getApplication()), new SonicConfig.Builder().build());
        }
        SonicSessionClientImpl sonicSessionClient = null;
        //步骤2:创建SonicSession
        sonicSession = SonicEngine.getInstance().createSession(url,  new SonicSessionConfig.Builder().build());
        if (null != sonicSession) {
            sonicSession.bindClient(sonicSessionClient = new SonicSessionClientImpl());
        } else {
            //只有在同一个声音会话已经运行时才会发生,
            //可以将以下代码注释为默认模式。
            throw new UnknownError("create session fail!");
        }
        //步骤3:BindWebView为sessionClient和bindClient为SonicSession 
        //在现实世界中,init流可能花费很长的时间在启动
        //运行时,初始化CONFIGS .... 
        setContentView(R.layout.activity_browser);
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.setWebViewClient(new WebViewClient() {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                if (sonicSession != null) {
                    sonicSession.getSessionClient().pageFinish(url);
                }
            }
            @TargetApi(21)
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {
                return shouldInterceptRequest(view, request.getUrl().toString());
            }
            @Override
            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {
                if (sonicSession != null) {
                //第6步:致电sessionClient.requestResource当主机允许应用程序
                //返回本地数据。
                    return (WebResourceResponse) sonicSession.getSessionClient().requestResource(url);
                }
                return null;
            }
        });

        WebSettings webSettings = webView.getSettings();

        //步骤4:绑定javascript 
        //注意:如果api级别低于17(android 4.2),addJavascriptInterface有安全性
        //问题,请使用x5或参见https://developer.android.com/reference/android/webkit/ 
        // WebView.html#addJavascriptInterface(java.lang.Object,java.lang.String)
        webSettings.setJavaScriptEnabled(true);
        webView.removeJavascriptInterface("searchBoxJavaBridge_");
        intent.putExtra(SonicJavaScriptInterface.PARAM_LOAD_URL_TIME, System.currentTimeMillis());
        webView.addJavascriptInterface(new SonicJavaScriptInterface(sonicSessionClient, intent), "sonic");
        // init webview设置 
        webSettings.setAllowContentAccess(true);
        webSettings.setDatabaseEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setAppCacheEnabled(true);
        webSettings.setSavePassword(false);
        webSettings.setSaveFormData(false);
        webSettings.setUseWideViewPort(true);
        webSettings.setLoadWithOverviewMode(true);
        //步骤5:webview已经准备就绪,只需告诉会话客户端绑定
        if (sonicSessionClient != null) {
            sonicSessionClient.bindWebView(webView);
            sonicSessionClient.clientReady();
        } else { //默认模式 
            webView.loadUrl(url);
        }
    }
    @Override
    public void onBackPressed() {
        super.onBackPressed();
    }
    @Override
    protected void onDestroy() {
        if (null != sonicSession) {
            sonicSession.destroy();
            sonicSession = null;
        }
        super.onDestroy();
    }
}

简简单单的几十行代码,搞定你的webview的加载速度。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Android使用Hybrid框架VasSonic教程