{"id":1762,"date":"2017-08-10T16:35:37","date_gmt":"2017-08-10T08:35:37","guid":{"rendered":"http:\/\/www.xttblog.com\/?p=1762"},"modified":"2017-08-10T16:35:37","modified_gmt":"2017-08-10T08:35:37","slug":"android%e4%bd%bf%e7%94%a8hybrid%e6%a1%86%e6%9e%b6vassonic%e6%95%99%e7%a8%8b","status":"publish","type":"post","link":"https:\/\/www.xttblog.com\/?p=1762","title":{"rendered":"Android\u4f7f\u7528Hybrid\u6846\u67b6VasSonic\u6559\u7a0b"},"content":{"rendered":"<p>\n\t\u7c7b\u4f3c\u4e8e\u5c0f\u7a0b\u5e8f\u8fd9\u6837\u7684\u529f\u80fd\uff0c\u817e\u8baf\u5c1d\u8bd5\u4e86\u5f88\u591a\u65b9\u5f0f\u6765\u63d0\u9ad8\u6253\u5f00\u901f\u5ea6\u3002\u5305\u62ec\u51b7\u70ed\u542f\u52a8\u591a\u8fdb\u7a0b\u3001\u591a\u7ebf\u7a0b\u5e76\u884c\u3001\u51cf\u5197\u4f59JS\u63d2\u4ef6\u3001\u9884\u52a0\u8f7d\u3001webview\u590d\u7528\u3001\u53cd\u5c04\u3001\u7d20\u6750\u6821\u9a8c\u3001\u8fdb\u7a0b\u5197\u4f59\u542f\u52a8\u6d41\u7a0b\u3001redex\u7b49\uff0c\u4e00\u6b65\u6b65\u8d70\u4e86\u4e00\u5e74\u591a\u6700\u7ec8\u5b8c\u5584\u5230<a href=\"https:\/\/github.com\/Tencent\/VasSonic\" name=\"VasSonic\" target=\"_blank\" title=\"VasSonic\">sonic<\/a>\u3002\u6839\u636e sonic \u7684\u6d4b\u8bd5\u5bf9\u6bd4\uff0c\u6211\u4eec\u53d1\u73b0\u91c7\u7528sonic\u7684\u7ed3\u6784\u786e\u5b9e\u5728\u6253\u5f00H5\u9996\u5c4f\u6548\u7387\u4e0a\u63d0\u5347\u4e86\u4e0d\u5c11\u3002\u672c\u6587\u5c06\u8be6\u7ec6\u7684\u8bb2\u89e3\u4f7f\u7528Android\u8bbe\u5907\u914d\u5408sonic\u5f00\u53d1\u7684\u793a\u4f8b\u6559\u7a0b\u3002\n<\/p>\n<p>\n\t<img decoding=\"async\" alt=\"Sonic \u4e13\u6ce8\u4e8e\u63d0\u5347H5\u9996\u5c4f\u52a0\u8f7d\u901f\u5ea6\" src=\"http:\/\/ocuzluml6.bkt.clouddn.com\/Vas-Sonic.png\" style=\"width: 428px;height: 120px\" \/>\n<\/p>\n<p>\n\t\u91c7\u7528&nbsp;VasSonic \u6211\u4eec\u9996\u5148\u9700\u8981\u505a\u7684\u662f\uff0c\u4e0b\u8f7d VasSonic \u7684<a href=\"https:\/\/github.com\/Tencent\/VasSonic\/tree\/master\/sonic-android\" name=\"sonic-android\" target=\"_blank\" title=\"sonic-android\">SDK<\/a>\u3002\n<\/p>\n<p>\n\t\u5728\u60a8\u7684\u6a21\u5757\u7684build.gradle\u4e2d\u6dfb\u52a0VasSonic gradle\u63d2\u4ef6\u4f5c\u4e3a\u4f9d\u8d56\u3002\n<\/p>\n<pre class=\"brush:java;\">\r\ncompile &#039;com.tencent.sonic:sdk:1.0.0&#039;<\/pre>\n<h2>\n\t\u5b9e\u73b0\u58f0\u97f3\u754c\u9762<br \/>\n<\/h2>\n<p>\n\t\u5b9e\u73b0\u4e00\u4e2a\u6269\u5c55\u7684\u7c7b SonicRuntime\u3002\n<\/p>\n<p>\n\tSonicRuntime\u662f\u4e0e\u7cfb\u7edf\u4e2d\u6574\u4f53\u8fd0\u884c\u4fe1\u606f\u8fdb\u884c\u4ea4\u4e92\u7684\u7c7b\uff0c\u5305\u62ecContext\uff0cUA\uff0cID\uff08\u8fd9\u662f\u4fdd\u5b58\u6570\u636e\u7684\u552f\u4e00\u6807\u8bc6\uff09\u548c\u5176\u4ed6\u4fe1\u606f\u3002\n<\/p>\n<pre class=\"brush:java;\">\r\n\/**\r\n* \u4e0b\u9762\u662fSonicRuntime\u7684\u6837\u672c\u5b50\u7c7b\r\n*\/\r\npublic class HostSonicRuntime extends SonicRuntime {\r\n    public HostSonicRuntime(Context context) {\r\n        super(context);\r\n    }\r\n    \/**\r\n     * @return \u8fd4\u56de\u7528\u6237UA \r\n     *\/\r\n    @Override\r\n    public String getUserAgent() {\r\n        return &quot;&quot;;\r\n    }\r\n    \/**\r\n     * @return \u8fd4\u56de\u7528\u6237\u7684ID\u3002\r\n     *\/\r\n    @Override\r\n    public String getCurrentUserAccount() {\r\n        return &quot;&quot;;\r\n    }\r\n    \/**\r\n     * @return \u8fd4\u56de\u7528\u4e8e\u4fdd\u5b58Sonic\u7f13\u5b58\u7684\u6587\u4ef6\u8def\u5f84\u3002\r\n     *\/\r\n    @Override\r\n    public File getSonicCacheDir() {\r\n        String path = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + &quot;sonic\/&quot;;\r\n        File file = new File(path.trim());\r\n        if(!file.exists()){\r\n            file.mkdir();\r\n        }\r\n        return file;\r\n    }\r\n}<\/pre>\n<p>\n\t\u5b9e\u73b0\u4e00\u4e2a\u6269\u5c55\u7684\u5b50\u7c7b SonicSessionClient\u3002\n<\/p>\n<pre class=\"brush:java;\">\r\n\/**\r\n * SonicSessionClient\u662f\u4e00\u4e2a\u7cbe\u7b80\u7684API\u7c7b\uff0c\u5c06\u5176\u516c\u5171API\u59d4\u6258\u7ed9\u540e\u7aefWebView\u7c7b\u5b9e\u4f8b\uff0c\u5982loadUrl\u548cloadDataWithBaseUrl\u3002\r\n *\/\r\npublic class SonicSessionClientImpl extends SonicSessionClient {\r\n    private WebView webView;\r\n    public void bindWebView(WebView webView) {\r\n        this.webView = webView;\r\n    }\r\n    @Override\r\n    public void loadUrl(String url, Bundle extraData) {\r\n        webView.loadUrl(url);\r\n    }\r\n    @Override\r\n    public void loadDataWithBaseUrl(String baseUrl, \r\n\t\tString data, String mimeType, \r\n\t\tString encoding,String historyUrl) {\r\n        webView.loadDataWithBaseURL(baseUrl, data, mimeType, encoding, historyUrl);\r\n    }\r\n}<\/pre>\n<h2>\n\tAndroid\u793a\u4f8b<br \/>\n<\/h2>\n<p>\n\t\u8fd9\u662f\u4e00\u4e2a\u7b80\u5355\u7684\u6f14\u793a\uff0c\u6f14\u793a\u5982\u4f55\u521b\u5efa\u4e00\u4e2a\u4f7f\u7528VasSonic\u6846\u67b6\u7684Android\u6d3b\u52a8\u3002\n<\/p>\n<pre class=\"brush:java;\">\r\npublic class BrowserActivity extends Activity {\r\n    public final static String PARAM_URL = &quot;param_url&quot;;\r\n    public final static String PARAM_MODE = &quot;param_mode&quot;;\r\n    private SonicSession sonicSession;\r\n    @Override\r\n    protected void onCreate(Bundle savedInstanceState) {\r\n        super.onCreate(savedInstanceState);\r\n        Intent intent = getIntent();\r\n        String url = intent.getStringExtra(PARAM_URL);\r\n        int mode = intent.getIntExtra(PARAM_MODE, -1);\r\n        if (TextUtils.isEmpty(url) || -1 == mode) {\r\n            finish();\r\n            return;\r\n        }\r\n        getWindow().addFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);\r\n        \/\/\u6b65\u9aa41\uff1a\u5982\u6709\u5fc5\u8981\u521d\u59cb\u5316\u58f0\u97f3\u5f15\u64ce\uff0c\u6216\u8005\u4e5f\u8bb8\u5f53\u5e94\u7528\u7a0b\u5e8f\u521b\u5efau\u80fd\u505a\u5230\u8fd9\u4e00\u70b9\r\n        if (!SonicEngine.isGetInstanceAllowed()) {\r\n            SonicEngine.createInstance(new SonicRuntimeImpl(getApplication()), new SonicConfig.Builder().build());\r\n        }\r\n        SonicSessionClientImpl sonicSessionClient = null;\r\n        \/\/\u6b65\u9aa42\uff1a\u521b\u5efaSonicSession\r\n        sonicSession = SonicEngine.getInstance().createSession(url,  new SonicSessionConfig.Builder().build());\r\n        if (null != sonicSession) {\r\n            sonicSession.bindClient(sonicSessionClient = new SonicSessionClientImpl());\r\n        } else {\r\n            \/\/\u53ea\u6709\u5728\u540c\u4e00\u4e2a\u58f0\u97f3\u4f1a\u8bdd\u5df2\u7ecf\u8fd0\u884c\u65f6\u624d\u4f1a\u53d1\u751f\uff0c\r\n            \/\/\u53ef\u4ee5\u5c06\u4ee5\u4e0b\u4ee3\u7801\u6ce8\u91ca\u4e3a\u9ed8\u8ba4\u6a21\u5f0f\u3002\r\n            throw new UnknownError(&quot;create session fail!&quot;);\r\n        }\r\n        \/\/\u6b65\u9aa43\uff1aBindWebView\u4e3asessionClient\u548cbindClient\u4e3aSonicSession \r\n        \/\/\u5728\u73b0\u5b9e\u4e16\u754c\u4e2d\uff0cinit\u6d41\u53ef\u80fd\u82b1\u8d39\u5f88\u957f\u7684\u65f6\u95f4\u5728\u542f\u52a8\r\n        \/\/\u8fd0\u884c\u65f6\uff0c\u521d\u59cb\u5316CONFIGS .... \r\n        setContentView(R.layout.activity_browser);\r\n        WebView webView = (WebView) findViewById(R.id.webview);\r\n        webView.setWebViewClient(new WebViewClient() {\r\n            @Override\r\n            public void onPageFinished(WebView view, String url) {\r\n                super.onPageFinished(view, url);\r\n                if (sonicSession != null) {\r\n                    sonicSession.getSessionClient().pageFinish(url);\r\n                }\r\n            }\r\n            @TargetApi(21)\r\n            @Override\r\n            public WebResourceResponse shouldInterceptRequest(WebView view, WebResourceRequest request) {\r\n                return shouldInterceptRequest(view, request.getUrl().toString());\r\n            }\r\n            @Override\r\n            public WebResourceResponse shouldInterceptRequest(WebView view, String url) {\r\n                if (sonicSession != null) {\r\n                \/\/\u7b2c6\u6b65\uff1a\u81f4\u7535sessionClient.requestResource\u5f53\u4e3b\u673a\u5141\u8bb8\u5e94\u7528\u7a0b\u5e8f\r\n                \/\/\u8fd4\u56de\u672c\u5730\u6570\u636e\u3002\r\n                    return (WebResourceResponse) sonicSession.getSessionClient().requestResource(url);\r\n                }\r\n                return null;\r\n            }\r\n        });\r\n\r\n        WebSettings webSettings = webView.getSettings();\r\n\r\n        \/\/\u6b65\u9aa44\uff1a\u7ed1\u5b9ajavascript \r\n        \/\/\u6ce8\u610f\uff1a\u5982\u679capi\u7ea7\u522b\u4f4e\u4e8e17\uff08android 4.2\uff09\uff0caddJavascriptInterface\u6709\u5b89\u5168\u6027\r\n        \/\/\u95ee\u9898\uff0c\u8bf7\u4f7f\u7528x5\u6216\u53c2\u89c1https:\/\/developer.android.com\/reference\/android\/webkit\/ \r\n        \/\/ WebView.html\uff03addJavascriptInterface\uff08java.lang.Object\uff0cjava.lang.String\uff09\r\n        webSettings.setJavaScriptEnabled(true);\r\n        webView.removeJavascriptInterface(&quot;searchBoxJavaBridge_&quot;);\r\n        intent.putExtra(SonicJavaScriptInterface.PARAM_LOAD_URL_TIME, System.currentTimeMillis());\r\n        webView.addJavascriptInterface(new SonicJavaScriptInterface(sonicSessionClient, intent), &quot;sonic&quot;);\r\n        \/\/ init webview\u8bbe\u7f6e \r\n        webSettings.setAllowContentAccess(true);\r\n        webSettings.setDatabaseEnabled(true);\r\n        webSettings.setDomStorageEnabled(true);\r\n        webSettings.setAppCacheEnabled(true);\r\n        webSettings.setSavePassword(false);\r\n        webSettings.setSaveFormData(false);\r\n        webSettings.setUseWideViewPort(true);\r\n        webSettings.setLoadWithOverviewMode(true);\r\n        \/\/\u6b65\u9aa45\uff1awebview\u5df2\u7ecf\u51c6\u5907\u5c31\u7eea\uff0c\u53ea\u9700\u544a\u8bc9\u4f1a\u8bdd\u5ba2\u6237\u7aef\u7ed1\u5b9a\r\n        if (sonicSessionClient != null) {\r\n            sonicSessionClient.bindWebView(webView);\r\n            sonicSessionClient.clientReady();\r\n        } else { \/\/\u9ed8\u8ba4\u6a21\u5f0f \r\n            webView.loadUrl(url);\r\n        }\r\n    }\r\n    @Override\r\n    public void onBackPressed() {\r\n        super.onBackPressed();\r\n    }\r\n    @Override\r\n    protected void onDestroy() {\r\n        if (null != sonicSession) {\r\n            sonicSession.destroy();\r\n            sonicSession = null;\r\n        }\r\n        super.onDestroy();\r\n    }\r\n}<\/pre>\n<p>\n\t\u7b80\u7b80\u5355\u5355\u7684\u51e0\u5341\u884c\u4ee3\u7801\uff0c\u641e\u5b9a\u4f60\u7684webview\u7684\u52a0\u8f7d\u901f\u5ea6\u3002<\/p>\n<!-- <audio autoplay=\"autoplay\" height=\"100\" width=\"100\" hidden=\"true\"><source src=\"https:\/\/c.coka.la\/orAvPR.mp3\" type=\"audio\/mp3\"\/><\/audio><img decoding=\"async\" src=\"https:\/\/images.weserv.nl\/?url=https:\/\/ws3.sinaimg.cn\/large\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/> --><p><!-- <img decoding=\"async\" src=\"https:\/\/raw.githubusercontent.com\/xmt1139057136\/xttblog\/master\/8fa5dcfcgy1g4em3rzar5j20ib089ae0.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/>--><img decoding=\"async\" src=\"https:\/\/saas.51autoparts.cn\/api\/admin\/sys-file\/oss\/file?fileName=84db51f8561e448f9a4fda2eff0811f9.jpg\" alt=\"\u4e1a\u4f59\u8349\u516c\u4f17\u53f7\"\/><\/p><p>\u6700\u540e\uff0c\u6b22\u8fce\u5173\u6ce8\u6211\u7684\u4e2a\u4eba\u5fae\u4fe1\u516c\u4f17\u53f7\uff1a\u4e1a\u4f59\u8349\uff08yyucao\uff09\uff01<b>\u53ef\u52a0\u4f5c\u8005\u5fae\u4fe1\u53f7\uff1a<font color=\"red\">xttblog2<\/font>\u3002\u5907\u6ce8\uff1a\u201c1\u201d\uff0c\u6dfb\u52a0\u535a\u4e3b\u5fae\u4fe1\u62c9\u4f60\u8fdb\u5fae\u4fe1\u7fa4\u3002\u5907\u6ce8\u9519\u8bef\u4e0d\u4f1a\u540c\u610f\u597d\u53cb\u7533\u8bf7\u3002<\/b>\u518d\u6b21\u611f\u8c22\u60a8\u7684\u5173\u6ce8\uff01\u540e\u7eed\u6709\u7cbe\u5f69\u5185\u5bb9\u4f1a\u7b2c\u4e00\u65f6\u95f4\u53d1\u7ed9\u60a8\uff01\u539f\u521b\u6587\u7ae0\u6295\u7a3f\u8bf7\u53d1\u9001\u81f3532009913@qq.com\u90ae\u7bb1\u3002\u5546\u52a1\u5408\u4f5c\u4e5f\u53ef\u6dfb\u52a0\u4f5c\u8005\u5fae\u4fe1\u8fdb\u884c\u8054\u7cfb\uff01<\/p><p>\u672c\u6587\u539f\u6587\u51fa\u5904\uff1a<a href=\"https:\/\/www.xttblog.com\">\u4e1a\u4f59\u8349<\/a>\uff1a &raquo; <a href=\"https:\/\/www.xttblog.com\/?p=1762\">Android\u4f7f\u7528Hybrid\u6846\u67b6VasSonic\u6559\u7a0b<\/a><\/p><!-- <div class=\"bd-reward-stl\"><button id=\"bdRewardBtn\"><span><\/span><\/button><\/div> -->","protected":false},"excerpt":{"rendered":"<p>\u7c7b\u4f3c\u4e8e\u5c0f\u7a0b\u5e8f\u8fd9\u6837\u7684\u529f\u80fd\uff0c\u817e\u8baf\u5c1d\u8bd5\u4e86\u5f88\u591a\u65b9\u5f0f\u6765\u63d0\u9ad8\u6253\u5f00\u901f\u5ea6\u3002\u5305\u62ec\u51b7\u70ed\u542f\u52a8\u591a\u8fdb\u7a0b\u3001\u591a\u7ebf\u7a0b\u5e76\u884c\u3001\u51cf\u5197\u4f59JS\u63d2\u4ef6\u3001\u9884\u52a0 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[891,1421,1418,1420],"class_list":["post-1762","post","type-post","status-publish","format-standard","hentry","category-java","tag-android","tag-hybrid","tag-sonic","tag-vassonic"],"_links":{"self":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/1762","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1762"}],"version-history":[{"count":1,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/1762\/revisions"}],"predecessor-version":[{"id":1763,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=\/wp\/v2\/posts\/1762\/revisions\/1763"}],"wp:attachment":[{"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1762"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xttblog.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}