- 拦截 WebViewClient.shouldOverrideUrlLoading方法
//格式:fusion://invokeNative?module=xxx&method=xxx&arguments=jsonarraystring
module对应AbstractBridgeModule实现类,method对应最终方法
2.解析uri,从namespaceMap中根据module获取最终AbstractBridgeModule的实现类
3.通过方法注解
- 反射调用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方法。
网友评论