Android实现H5与Native交互的几种方式
程序员文章站
2022-07-13 16:36:02
...
Android中使用控件WebView来承载展示H5,那么Java本地方法调用H5中的Js方法同样也要用到WebView对应的Api。
Java本地方法调js
通过WebView调用
- loadUrl(String)方法执行js
- evaluateJavascript(String, ValueCallback)执行js,注意:此方法只支持android.os.Build.VERSION_CODES.N及以上
利用JsBridge
引用第三方库lzyzsd/JsBridge
js调用Java本地方法
通过WebView调用
- 初始化WebSettings
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
- 创建一个提供给js调用的方法类JsMethod
public class JsMethod {
...
@JavascriptInterface
public static void launch(String act) {
Class<Activity> cls = null;
try {
cls = (Class<Activity>) Class.forName(act);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
if (cls != null) {
Intent intent = new Intent(context, cls);
context.startActivity(intent);
}
}
}
注意: andorid4.2及以上,必须加JavascriptInterface注解,否则js无法调用android方法
- 将方法类JsMethod给WebView
JsMethod method = new JsMethod(this, webview);
webView.addJavascriptInterface(method, "jsCallee");
注意:此处的第二个参数必须跟js里面调用方法的对象的名称保持一致
- js端调用
function launch(){
window.jsCallee.launch("com.demo.MainAcitivity");
}
通过Url拦截
android中通过WebView#setWebViewClient(WebViewClient)设置WebViewClient,通过WebViewClient中的shouldOverrideUrlLoading方法拦截并解析Url。
webview.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
//解析url
return super.shouldOverrideUrlLoading(view, url);
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
//解析url
return super.shouldOverrideUrlLoading(view, request);
}
});
注意:shouldOverrideUrlLoading()方法的返回值:
- 返回true,即根据代码逻辑执行相应操作,webview不加载该url
- 返回false,除执行相应代码外,webview加载该url
- 返回super.shouldOverrideUrlLoading(),其实返回的还是false
对比
- 通过addJavascriptInterface()方式调用Java本地方法只适用于Android,iOS不行,这样就必须写两套
- 通过Url拦截方法两边都适用,并且可以在业务比较复杂的情况下复用Url解析规则,降低维护成本,但是一旦规则太多了之后会出现很多条件判断,所以要提前做好分类处理,不要把所有规则的处理放到一个类里面
感谢大家的支持,如有错误请指正,如需转载请标明原文出处!