var data = prompt(“native://getUserInfo?id=1”);
console.log(‘data:’ + data);
在为WebView设置WebChromeClient
的时候重写onJsPrompt
方法,如下:
@Override
public boolean onJsPrompt(WebView view, String url, String message, String defaultValue, JsPromptResult result) {
Uri uri = Uri.parse(message);
//如果是调nativeAPI.
if (url.startsWith(“native://”)) {
result.confirm(“call natvie api success”);
return true;
}
return super.onJsPrompt(view, url, message, defaultValue, result);
}
shouldOverrideUrlLoading
前端页面的Js代码:
document.location=“native://getUserInfo?id=1”;
native层面在为WebView设置WebViewClient
对象时,我们需要重写shouldOverrideUrlLoading
方法。需要注意的是,WebViewClient
中有两个shouldOverrideUrlLoading
方法的定义:
public boolean shouldOverrideUrlLoading(WebView view, String url)
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request)
其中上面一个在sdk中已被标记Deprecated
, 下面一个是在android 7.0中才引入的,所以为了避免兼容性问题。在使用时,建议这两个方法都重写。
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//如果是调nativeAPI.
if (url.startsWith(“native://”)) {
Log.i(“CommonWebViewClient”, “shouldOverrideUrlLoading execute------>”)
return true;
}
return super.shouldOverrideUrlLoading(view, url);
}
@JavascriptInterface
在 Android 4.2以下有安全漏洞, 但目前我们的app大部份最小支持版本都已经升到5.0了,这个可以忽略,当然感兴趣可以自己搜索。
在native层面,我们需为要WebView注入一个对象,用来处理两边的数据交互。注入方式如下:
- 首先定义一个类来处理两边的交互:
public class HybridAPI {
public static final String TAG = “HybridAPI”;
@JavascriptInterface
public void sendToNative(final String message) {
Log.i(TAG, “get data from js------------>” + message);
}
}
- 在
WebView
中注入这个类的实例
H