美文网首页
js调用Native

js调用Native

作者: 小虫虫奇遇记 | 来源:发表于2020-08-09 10:45 被阅读0次
    image.png
    1. 拦截 WebViewClient.shouldOverrideUrlLoading方法

    //格式:fusion://invokeNative?module=xxx&method=xxx&arguments=jsonarraystring
    module对应AbstractBridgeModule实现类,method对应最终方法

    2.解析uri,从namespaceMap中根据module获取最终AbstractBridgeModule的实现类
    3.通过方法注解

    1. 反射调用targetMethod.invoke(getExportModuleInstance(targetClass), argsData);
    • jsBridge类和方法预加载时机:
      App onCreate通过Module类的注解加载Module实例,保存在内存中(namespaceMap),key: moduleName, value:Module.class.
    @Export("AModule")
    public class AModule extends AbstractBridgeModule {
    }
    
    • jsBridgeModule生命周期绑定:
      AbstractBridgeModule 构造函数中hybridcontainer作为参数,持有activity引用

    • WebViewClient 持有mContainer,shouldOverrideUrlLoading也可直接通过 tel:// 直接跳转系统的拨号界面

    mContainer.getActivity().startActivity(new Intent(Intent.ACTION_DIAL, uri)
    -HybridActivity 实现HybridableContainer接口

    • Native调用js
      /**
      • 访问js方法
        */
        if (!TextUtils.isEmpty(js)) {
        if (!js.startsWith("javascript:")) {
        js = "javascript:" + js;
        }

         if (VERSION.SDK_INT < 19) {
             webView.loadUrl(js);
         } else {
             webView.evaluateJavascript(js, new ValueCallback<String>() {
                 public void onReceiveValue(String value) {
                     LogUtils.d("Webview", "onReceive js Value, value====" + value);
                 }
             });
         }
        

        }

    https://blog.csdn.net/carson_ho/article/details/64904691

    shouldOverrideUrlLoading调用时机:二级链接

    • WebView的前进、后退、刷新、以及post请求都不会调用shouldOverrideUrlLoading方法,除去以上行为,还得满足( ! isLoadUrl || isRedirect) 即 (不是通过webView.loadUrl来加载的 或者 是重定向) 这个条件,才会调用shouldOverrideUrlLoading方法。

    相关文章

      网友评论

          本文标题:js调用Native

          本文链接:https://www.haomeiwen.com/subject/flovrktx.html