最近項目開發使用了 Android 原生和 H5 的混合開發,以前也沒怎麼接觸過。所以這次和 H5 聯調對接還是踩了很多坑,這裏也做個總結希望可以幫助到大家...
首先 Android 和 H5 主要的坑是在彼此之間的數據交互;而如果只是彼此之間簡單的界面調用的話,還不是很難。網上搜索有很多的資料,這裏也就不說了。
1,Android 調用 H5 的函數,並且 Android 端傳遞相關參數到 H5;
H5 界面代碼如下:
getFromAndroid = function(userid){ arr = userid.split(",") } // android to js功能函數 getFromAndroid 中的參數 userid 就是 Android 端傳遞過來的參數值,在 H5 代碼中就也可以直接使用了...
而 Android 端代碼如下:
WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAllowFileAccess(true); webSettings.setAllowFileAccessFromFileURLs(true); webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setAppCacheEnabled(true); webSettings.setAllowContentAccess(true); mWebView.addJavascriptInterface(new JsInteration(), "android"); mWebView.loadUrl("file:///android_asset/tougu/index.html"); mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); //頁面開始加載前 } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); String h5Str = mUserId + "," + mGroupId + "," + mOwnUserid; //頁面加載完畢 //從 Android 傳遞參數到 H5 界面 view.loadUrl("javascript:getFromAndroid(\"" + h5Str + "\")"); } });
當界面加載完成後:
//從 Android 傳遞參數到 H5 界面
view.loadUrl("javascript:getFromAndroid(\"" + h5Str + "\")");
/** * H5 交互 class */ public class JsInteration { @JavascriptInterface public void back(String value) { value就是 H5 界面傳遞過來的參數值 String[] arrayList = value.split("#"); mIsAtention = arrayList[0]; } } /** * 跳轉到組合詳情界面( h5 界面) */ @TargetApi(Build.VERSION_CODES.KITKAT) private void go2CombinationDetail() { WebSettings webSettings = mWebView.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAllowFileAccess(true); webSettings.setAllowFileAccessFromFileURLs(true); webSettings.setAllowUniversalAccessFromFileURLs(true); webSettings.setAppCacheEnabled(true); webSettings.setAllowContentAccess(true); mWebView.addJavascriptInterface(new JsInteration(), "android"); mWebView.loadUrl("file:///android_asset/tougu/index.html"); // mWebView.getSettings().setJavaScriptEnabled(true); //開啓JavaScript支持 mWebView.setWebViewClient(new WebViewClient() { @Override public void onPageStarted(WebView view, String url, Bitmap favicon) { super.onPageStarted(view, url, favicon); //頁面開始加載前 } @Override public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); //從 H5 界面傳遞參數到 Android view.evaluateJavascript("setUserId()", new ValueCallback<String>() { @Override public void onReceiveValue(String value) { } }); }上面 setUserId()爲 H5 方法, JsInteration.back( String value) 爲 H5 setUserId() 方法再次調用的 Android 端方法。其中 String value 就是 H5 傳遞過來的參數;
setUserId = function(){ var result =window.android.back( value); }
@Override public boolean shouldOverrideUrlLoading(WebView view, String url) { //頁面開始加載 if (url.equals("file:///android_asset/test1.html")) { Intent intent = new Intent(KdsCombinationDetailActivity.this, KdsPoliticaRecordActivity.class); intent.putExtra(KdsConstant.STROLL2DETAIL_OTHER_ID, mUserId); intent.putExtra(KdsConstant.STROLL2DETAIL_GROUP_ID, mGroupId); startActivity(intent); return true; } else if (url.equals("file:///android_asset/test2.html")) { KdsUtils.showNotifyToast(KdsCombinationDetailActivity.this, "gotoWeixin"); // 分享網頁 shareUrl(true); return true; } return super.shouldOverrideUrlLoading(view, url); } });
<div id="weixin"> <a href="file:///android_asset/test1.html"> <img src="images/weixin.svg" style="width: 8.33333rem !important;"> </a> </div> <span>微信</span> </li> <li> <div id="friend"> <a href="file:///android_asset/test2.html"> <img src="images/frist.svg" style="width: 8.33333rem !important;"> </a> </div>其中重點主要是使用 shouldOverriderUrlLoading() 方法,使用參數 url 來匹配。(這是和 H5 約定的 url;注意這裏的 url 它的格式,如果只是常量字符串是匹配不到的)