美文网首页
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