Android中JS互動的一些小問題
詳細的如何構建android和h5之間的互動,不詳細多說了,直接上程式碼
WebSettings webSettings =webView.getSettings(); webSettings.setJavaScriptEnabled(true); webView.addJavascriptInterface(newJSInterface(this,webView,gadgetInfos[0].getId()),"myobj");//在JSHook類裡實現javascript想呼叫的方法,並將其例項化傳入webview, "hello"這個字串告訴javascript呼叫哪個例項的方法 webView.setWebViewClient(newWebViewClient() { @Override public booleanshouldOverrideUrlLoading(WebView view,String url) { //Log.d("abc", " url:"+url); view.loadUrl(url);// 當開啟新連結時,使用當前的 WebView,不會使用系統其他瀏覽器 return true; } }); webView.loadUrl("http://html.***/lxsdk/android.html?gadget_id="+gadgetInfos[0].getId());
在自定義的一個工具類 JSInterface,放置需要與H5互動的方法 如下
/** * 0.5登入伺服器 * *@paramuserName *@paramlenovoId *@paramtoken *@paramlanguageContext:上下文 *userName:使用者名稱 *lenovoId:lenovoIdSDK返回的 *Token:lenovoId返回 *Language:語言 */ @JavascriptInterface public voidlogin(finalString userName, finalString lenovoId, finalString token, finalString language) { mHandler.post(newRunnable() { @Override public voidrun() { HttpCmdCallback mLoginCallback =newHttpCmdCallback() { @Override public voidonResponse(Object object, intcode) { if(code == ConstantDef.ReturnCode.OK_SUCCESS) { callbackWebView(gadgetId,"login",object+"");//把結果返回給webview }else{ } } }; Commander.login(context,userName,lenovoId,token,language,mLoginCallback); //callbackWebView(); 把結果返回給webview } }); }
接下來把從伺服器中獲取的值返給h5 ,
public voidcallbackWebView(finalString id, finalString name, finalString data) { mHandler.post(newRunnable() { @Override public voidrun() { // put code here String cmd ="javascript:callbackdata('"+id+"', '"+name+"', '"+data+"')"; webView.loadUrl(cmd); } }); }
重新把資料結果load一下。
這篇文章的重點來了,之前測試,這些程式碼寫的都沒問題,但是就是不見h5介面有資料重新整理,導致排查了好久,最後發現,h5中寫的返回結果展示的程式碼,呼叫的是系統的彈出框 alert 。這個系統的彈出框在android和ios中都不展示,所以誤認為沒有互動成功。最後h5寫了一個自定義彈出框。
//回撥方法,app返回資料: function callbackdata(id,name,data){ alert(name); }