詳細(xì)的如何構(gòu)建android和h5之間的交互,不詳細(xì)多說了,直接上代碼
WebSettings webSettings =webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.addJavascriptInterface(newJSInterface(this,webView,gadgetInfos[0].getId()),"myobj");//在JSHook類里實(shí)現(xiàn)javascript想調(diào)用的方法,并將其實(shí)例化傳入webview, "hello"這個(gè)字串告訴javascript調(diào)用哪個(gè)實(shí)例的方法
webView.setWebViewClient(newWebViewClient() {
@Override
public booleanshouldOverrideUrlLoading(WebView view,String url) {
//Log.d("abc", " url:"+url);
view.loadUrl(url);// 當(dāng)打開新鏈接時(shí),使用當(dāng)前的 WebView,不會(huì)使用系統(tǒng)其他瀏覽器
return true;
}
});
webView.loadUrl("http://html.***/lxsdk/android.html?gadget_id="+gadgetInfos[0].getId());
在自定義的一個(gè)工具類 JSInterface睬辐,放置需要與H5交互的方法 如下
/**
* 0.5登錄服務(wù)器
*
*@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+"");//把結(jié)果返回給webview
}else{
}
}
};
Commander.login(context,userName,lenovoId,token,language,mLoginCallback);
// callbackWebView(); 把結(jié)果返回給webview
}
});
}
接下來把從服務(wù)器中獲取的值返給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);
}
});
}
重新把數(shù)據(jù)結(jié)果load一下宾肺。
這篇文章的重點(diǎn)來了溯饵,之前測試,這些代碼寫的都沒問題锨用,但是就是不見h5界面有數(shù)據(jù)刷新丰刊,導(dǎo)致排查了好久,最后發(fā)現(xiàn)增拥,h5中寫的返回結(jié)果展示的代碼啄巧,調(diào)用的是系統(tǒng)的彈出框 alert 寻歧。這個(gè)系統(tǒng)的彈出框在android和ios中都不展示,所以誤認(rèn)為沒有交互成功秩仆。最后h5寫了一個(gè)自定義彈出框码泛。
//回調(diào)方法,app返回?cái)?shù)據(jù):
function callbackdata(id,name,data){
alert(name);
}