详细的如何构建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);
}