项目中首页本来是android原生的,后来因为经常改动界面,修改布局,尤其是布局没有事先考虑好,如果用原生的android来开发需要频繁的发包,当然如果事先知道所有布局样式也可以先定义好几套模板,或者通过热修复技术也可以解决。后经过讨论把首页改成h5然后点击h5页面给我们传递参数,我们把js给我们的值传递给自己原生的界面,这样即使首页界面需要小调整我们也不需要发布。如果界面中有刷新或者加载更多,就需要android去调用js的方法,下面简单说下这两种是如何调用:
先给大家介绍一个封装比较好的webview:https://github.com/Justson/AgentWeb
还有腾讯的VasSonic:https://github.com/Tencent/VasSonic (专注提升h5首屏加载速度)
如果大家对以上比较感兴趣的可以参考:AgentWeb+VasSonic实现h5首页加速
如果只是想了解android和js是如何交互的请直接向下
最常见的是js调用android方法,js代码
function callAndroid(){
nativeMethod.pointsListLoaded("js传递给android的一个json字符串");
}
那android端该如何支持呢
如果网页是https的,请参考这里:http://blog.youkuaiyun.com/qq_33220645/article/details/76906396
如果有databinding不清楚的可以参考这里:http://blog.youkuaiyun.com/qq_33220645/article/details/76080898
http://blog.youkuaiyun.com/qq_33220645/article/details/76084532
//启用支持javascript
WebSettings settings = bindingView.mwebview.getSettings();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
settings.setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);//https加载WebView图片不显示问题
}
settings.setJavaScriptEnabled(true);
bindingView.mwebview.loadUrl(url);
bindingView.mwebview.getSettings().setDomStorageEnabled(true);
/**
* 让webview长按不能复制
*/
bindingView.mwebview.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return true;
}
});
/**
* 信任证书
*/
bindingView.mwebview.setWebViewClient(new WebViewClient() {
@Override
public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {
handler.proceed();//https的网页需要安装证书,或者信任证书才能访问
// super.onReceivedSslError(view, handler, error);
}
@Override
public void onReceivedError(WebView view, WebResourceRequest request, WebResourceError error) {
super.onReceivedError(view, request, error);
// showError();
}
});
// webView.getSettings().setDatabaseEnabled(true);
//覆盖WebView默认使用第三方或系统默认浏览器打开网页的行为,使网页用WebView打开
//优先使用缓存
// webView.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
//不使用缓存
bindingView.mwebview.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE);
bindingView.mwebview.addJavascriptInterface(new ClickResult(), "nativeMethod");
/**
* js点击事件处理
*/
private class ClickResult {
/**
* 积分明细数据加载完成
*
* @param result
* @return
*/
@JavascriptInterface
public String pointsListLoaded(String result) {//如果什么参数都不需要传递给android可以随便传递一个参数,android不拿就好否则会报错
analysisJson(result);//解析js传递的result跳转页面
return null;
}
}
下面是android数据加载完成告诉js数据加载完成,或者界面中有分页加载,需要加载下一页调用js方法
android代码如下:
bindingView.mwebview.loadUrl("javascript:getPointsList("android给js传递的值")");
js代码:
function getPointsList(param) {
alert(param);
document.getElementById('fromJS').innerHTML="我是android调用JS的方法";
showToast();
document.getElementById('fromJS').innerHTML=param;
}
当然js可以把所有方法放到本地集合中
那android也应该配合调用:
bindingView.mwebview.loadUrl("javascript:javascriptMethods.getPointsList()");
webview相关属性设置解释:
参考文章:http://blog.youkuaiyun.com/jdsjlzx/article/details/51376739
http://blog.youkuaiyun.com/Master_Miku/article/details/54913628