写在最前:
看Android最新技术总结,关注公众号:
最近因为App与H5交互逻辑太乱,所以抽空梳理了下;对目前App与H5的各种交互通信做个总结,自取适合自己的交互方式。
一、H5调用原生的native方法
1、拦截shouldOverrideUrlLoading方法
借助WebView在加载一个url的时候都会调用WebViewClient类的shouldOverrideUrlLoading(WebView view, String url)方法这一特性,我们可以针对参数的url定义好特殊的schema协议,来调用native提供的不同的逻辑;首先我们需要为WebView设置WebViewClient对象;接着重写shouldOverrideUrlLoading(WebView view, String url)方法;
这里先说明下App的schema,我们需要针对我们app定义一套自己的schema规范;schema指就是与H5约束好的字符串。h5在调用native方法的时候,需要以约束好的schema为协议,调用native方法。比如 nativeApp://xxxPath?xxxParam=yyy; 其中:nativeApp字符串指schame协议名称,每个App自己取就可以,我们只拦截该协议下的url请求,其他的可以不处理;xxxPath指关键路径,对应自己的native功能,比如nativeApp://login 表示调用本地登录界面等等;xxxParam=yyy,表示传递的参数,比如nativeApp://login?name=wang;
2、拦截alert、prompt、confirm处理方法
该方式与上面的拦截处理类似,只是针对H5拦截的地方不同;H5端在调用window.alert("nativeApp://login?name=wang")时,会调用WebChromeClient类的onJsAlert方法,我们在该方法中处理schema,调用native方法;
上面的实现是以alert拦截为实例,其他的prompt、confirm完全也可以,一般与H5端约束好就可以
3、addJavascriptInterface注册Android对象供H5调用
通过调用webView.addJavascriptInterface(对象实例, "对象名称")方法,注册一个Android对象到H5端;注册到H5的对象的方法需要添加@JavascriptInterface 注解,这样H5端才能正常调用;
H5端使用方式:window.appObject.alert(“我是H5来的提示”)就可以调用到native的方法
二、Android native端调用H5端方法
Android native目前通过WebView.loadUrl("javascript:方法名('参数')")来调用H5的方法;如H5有如下方法:
window.showCity = function(city){
console.log("我是Native传递来的城市:"+city)
}
Android调用:
mWebView.loadUrl(“javascript:window.showCity('北京')”);
在Android版本大于4.4(SDK19)时,可以使用evaluateJavascript(js,callBack)来调用H5端方法;如下:onReceiveValue(String value)的参数value是js方法的返回值;