欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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调用

  1. 初始化WebSettings
WebSettings settings = webview.getSettings();
settings.setJavaScriptEnabled(true);
  1. 创建一个提供给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方法

  1. 将方法类JsMethod给WebView
JsMethod method = new JsMethod(this, webview);
webView.addJavascriptInterface(method, "jsCallee");

注意:此处的第二个参数必须跟js里面调用方法的对象的名称保持一致

  1. 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()方法的返回值:

  1. 返回true,即根据代码逻辑执行相应操作,webview不加载该url
  2. 返回false,除执行相应代码外,webview加载该url
  3. 返回super.shouldOverrideUrlLoading(),其实返回的还是false

对比

  • 通过addJavascriptInterface()方式调用Java本地方法只适用于Android,iOS不行,这样就必须写两套
  • 通过Url拦截方法两边都适用,并且可以在业务比较复杂的情况下复用Url解析规则,降低维护成本,但是一旦规则太多了之后会出现很多条件判断,所以要提前做好分类处理,不要把所有规则的处理放到一个类里面

感谢大家的支持,如有错误请指正,如需转载请标明原文出处!

相关标签: 移动开发