第一次写,写的不好,大家谅解。
因为公司需要,所以在webview的这条充满巨大坑的路上走了一些路。
好了,说正文吧。
-----------------------------------------------------分割线------------------------------------------------------------------
根据需求,app要和H5进行相互的取值和传值。
基本的取值很简单。
首先创建一个webview
<WebView android:id="@+id/webview" android:layout_width="match_parent" android:layout_height="match_parent" />然后在activity里设置一些基本属性
private WebView webview;
webview= (WebView) findViewById(R.id.webview);
WebSettings webSettings = webview.getSettings(); webSettings.setJavaScriptEnabled(true); webSettings.setDomStorageEnabled(true); webSettings.setAppCacheMaxSize(1024 * 1024 * 1); String appCachePath = getApplicationContext().getCacheDir().getAbsolutePath(); webSettings.setAppCachePath(appCachePath); webSettings.setAllowFileAccess(true); webSettings.setAppCacheEnabled(true);这些属性 允许JS运行之类的。
重点来啦!
是否能和H5做上交互的重点。
webview.addJavascriptInterface(this, "android");至于这个属性,我就不多做解释啦,要懂的小伙伴,自己百度吧。
对于这个里面的值 android,是和H5里相辉相映的。
H5里需要写上方法 window.android.shareXW(data);
这里就是只获取window下android里的shareXW方法。
基本设置完成了。接下来就是如何取值了。
@JavascriptInterface public void shareWX(String activityname) { }写上对应的方法,就可以取到值了。
H5里按钮需要在监听里放上window.android.shareXW("传的值");
这样,在点击某个按钮的时候,这个方法就会被触发,得到值。
至于android给H5传值,也很简单。
先在H5里写一段JS
function javaCallJs(arg){
document.getElementById("content").innerHTML =
("欢迎:"+arg );
}
然后用webview调用JS方法并传值
webView.loadUrl("javascript:javaCallJs("+"'"+name+"'"+")");
这样H5就能接收到你传过去的值了。
和H5进行交互并不难,难的是我们该如何规范它,如何让我们复杂的交互更简单,新增的需求更快处理,这才是我们应该注重的地方。
当我想到规范的时候,第一反应就是定义实体类,根据需求的不同,定义不同的实体类
来接收和返回。虽然这种想法并没有太大的错误,但是并不完善,只怪自己经验太浅,道行不够深啊!
举个栗子吧!移动端请求后台获取了一个数组,打开H5后,需要从数组中遍历获取到该参数的id,但是H5端只有数组的某个参数。为了节省流量,少次请求,目前我认为的最好方法就是从移动端获取该参数的id,理所当然的,利用交互把参数从H5取出来,在客户端进行遍历再把得到的id传给H5端,但是要考虑一些特殊情况,比如数组中并没有H5传过来的参数时,我们应该怎么做?万一回传时JS不一样的我们又应该怎么做?同时请求的时候,我们回传的参数H5该如何判断哪个参数对应哪次请求呢?等等一些情况需要考虑......
根据那些特殊情况,我们可以定义一些固定参数来解决这些问题。
ApiName:String类型,根据函数名来判断是做哪一种操作。
Callback:String类型,如果需要回传就写上回调函数名,不需要则传null
id:String类型,辨认是哪次请求,id每次都不相同
status:String类型,回传时如果信息核对正确传true,不正确传false。
data:List<bean>,具体业务需要的参数写在这里。
目前我只能想到这么多,如果有补充,请提出。
例子:
H5向移动端传递个人信息,并保存在本地。
数据例子:
{
”ApiName”:”information”,
”Callback”:”FromWorkJS”,
“id”:”informationjs”,
“status”:”true”,
“data”:”{
“name”:”xiaoming”,
“gender”:”boy”,
“age”:”21”
}”
}
数据正常时返回的json数据包示例:
{
”ApiName”:”information”,
”Callback”:”FromWorkJS”,
“id”:”informationjs”,
“status”:”true”,
“data”:”{ }”
}