随着H5的广泛使用,Android开发过程中免不了会使用网页来做展示,那么web与native之间的通信就显得尤其重要了,其实际上是JavaScript与java之间的通信。本文将为大家详细介绍二者是如何实现交互的,需要的朋友可以参考一下
前言
附GitHub源码:WebViewExplore
一、JS调用Native的三种方式
1、通过WebView的addJavascriptInterface进行对象映射
需要注意的是这种调用方式,如果你的 minSdkVersion <=16那么需要考虑到4.2之前的漏洞问题。
mWebView.addJavascriptInterface(new JsCallAndroidInterface(), "JSCallBackInterface");
/**
* JS调用android原生方法1:
*
* 通过WebView的addJavascriptInterface()进行对象映射
*/
private class JsCallAndroidInterface {
/**
*@JavascriptInterface注解方法.
* js端调用,4.2以后安全;4.2以前,当JS拿到Android这个对象后,
* 就可以调用这个Android对象中所有的方法,包括系统类(java.lang.Runtime 类)
* 从而进行任意代码执行。
* @param msg
*/
@JavascriptInterface
public void callback(String msg) {
ToastUtil.showToast(APIWebViewActivity.this, "JS方法回调到web了 :" + msg);
}
}
2、通过WebViewClient shouldOverrideUrlLoading方法回调拦截url:
与url重定向类似,可在此做url的拦截,已达到针对性的调用native方法的目的。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
if (resolveShouldLoadLogic(url)) {
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
/**
* JS调用android原生方法2:
*
* 通过WebViewClient shouldOverrideUrlLoading方法回调拦截url
*
* 根据协议的参数,判断是否是所需要的url:
* 一般根据scheme(协议格式),authority(协议名)来判读
*
* @param url
* @return
*/
private boolean resolveShouldLoadLogic(String url) {
Uri uri = Uri.parse(url);
if (uri.getScheme().equals("js")) {
if (uri.getAuthority().equals("Authority")) {
ToastUtil.showToast(APIWebViewActivity.this, "方法2");
}
return true;
}
return false;
}
3、通过WebChromeClient的 onJsPrompt()等方法 ,回调拦截JS对话框prompt()等:
/**
* 是否支持页面中的js输入弹出框
*
* @param view
* @param url
* @param message
* @param defaultValue
* @param result
* @return
*/
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue,
JsPromptResult result) {
if (resolveJSPrompt(message)) {
return true;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}
/**
* JS调用android原生方法3:
*
* 通过WebChromeClient的 onJsAlert() onJsConfirm() onJsPrompt() 方法
* 回调拦截JS对话框alert() confirm() prompt()
*/
private boolean resolveJSPrompt(String message) {
Uri uri = Uri.parse(message);
if (uri.getScheme().equals("js")) {
if (uri.getAuthority().equals("Authority")) {
ToastUtil.showToast(APIWebViewActivity.this, "方法3");
}
return true;
}
return false;
}
完整源码
Js调用Native示例源码-JsToNativeBridgeActivity
二、Native调用WebView的两种方案
1、loadUrl("javascript:callJS()"):
此方法简洁、效率低。当不需要返回值且对性能要求较低时可以考虑使用:
/**
* Native调用JS方法一:
* 方法简洁、效率低
* 当不需要获取返回值且对性能要求较低时可选择使用。
*/
webView.loadUrl("javascript:callJS()");
2、evaluateJavascript(script,resultCallback):
需4.4以上才可使用,效率高且有返回值:
/**
* Native调用JS方法二:
* 效率高,有返回值(4.4以上系统使用)
*/
webView.evaluateJavascript("javascript:callJS('yao')", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
//此处为JS返回的结果
Logger.d("value:" + value);
}
});
完整源码
Native调用JS示例源码-NativeToJsBridgeActivity
到此这篇关于Android WebView开发之WebView与Native交互的文章就介绍到这了,更多相关Android WebView与Native交互内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
本文标题为:Android WebView开发之WebView与Native交互


- SurfaceView播放视频发送弹幕并实现滚动歌词 2023-01-02
- 最好用的ios数据恢复软件:PhoneRescue for Mac 2023-09-14
- Android实现监听音量的变化 2023-03-30
- Android MaterialButton使用实例详解(告别shape、selector) 2023-06-16
- 详解flutter engine 那些没被释放的东西 2022-12-04
- iOS 对当前webView进行截屏的方法 2023-03-01
- Flutter实现底部和顶部导航栏 2022-08-31
- Android实现轮询的三种方式 2023-02-17
- Android studio实现动态背景页面 2023-05-23
- 作为iOS开发,这道面试题你能答出来,说明你基础很OK! 2023-09-14