React Native在Android混编项目中的页面跳转和方法调用大致可以通过上面这张简图来描述下:
RN通信原理简单地讲就是,一方native(java)将其部分方法注册成一个映射表,另一方(js)再在这个映射表中查找并调用相应的方法,而Bridge担当两者间桥接的角色。
其实方法调用大致分为2种情况:
RN调用Android需要module名和方法名相同,而Android调用RN只需要方法名相同。
(1)RCTDeviceEventEmitter 事件方式
优点:可任意时刻传递,Native主导控制。
(2)Callback 回调方式
优点:JS调用,Native返回。
缺点:CallBack为异步操作,返回时机不确定
(3)Promise
优点:JS调用,Native返回。
缺点:每次使用需要JS调用一次
(4)直传常量数据(原生向RN)
跨域传值,只能从原生端向RN端传递。RN端可通过 NativeModules.[module名].[参数名] 的方式获取。
注意: RN层调用NativeModule层进行界面跳转时,需要设置FLAG_ACTIVITY_NEW_TASK标志。
例如下分别以 原生调用RN 和 RN调用原生 为例简单描述下:
需要添加facebook的两个图片加载库:(注意版本号尽量与你使用的RN版本内部使用的fresco版本保持一直)
https://github.com/crazycodeboy/RNStudyNotes/tree/master/React%20Native%E5%8E%9F%E7%94%9F%E6%A8%A1%E5%9D%97%E5%90%91JS%E4%BC%A0%E9%80%92%E6%95%B0%E6%8D%AE%E7%9A%84%E5%87%A0%E7%A7%8D%E6%96%B9%E5%BC%8F有时需要在native和js之间传递数据,有以下几种方式
Callback是最常用的设计模式之一。无论是java,oc,c#,还是js等都会看到Callback的身影;
native支持Callback类型的参数,该Callback对应js中的function。
Promises是es6的一个新的特性,在rn中非常重要。native也支持Promise。
native支持以事件的方式向js发送数据,像Android中的广播,iOS中的通知中心;接收方注册接收该事件即可接收到native发送的事件。
移动网络的发展推动移动APP盛行,目前市场上APP开发技术的类型主要有三种,native开发、hybrid开发、RN/weex开发。本文主要讲述hybrid APP中js调用native原理。hybrid APP就是利用Android/iOS上webview加载web网页,其实就是相当于用native做了一个外壳,然后里面加载网页。那站在业务层面上,只要没有太依赖性能,都能满足需求,那这里面有可能会用到一些硬件功能,比如:相机、位置等,这时就必须调用native。
1.js 调用 native,Android里面主要通过WebViewClient.shouldOverrideUrlLoading方法拦截指定格式的URL,通过拦截特定URL和获取对应的参数,来调用native对应的功能。这里我们主要通过cordova插件,来做例子说明
上面我们看到cordova的初始化,这里面主要对回调callback进行定义,js调用native之后,native处理完结果,将结果返回js,就是通过callback完成。
3.构造链接,并发送链接pokeNative
这里我们看到调用native可以通过iframe和通过XHR完成。
这就是js调用native的方式,native完成处理之后,通过webView.addJavascriptInterface调用js中挂载在window对象的方法,这是一个统一的回调nativeCallback ,通过callbackID识别出本次结果需要回调js中的哪个function。然后本次交互就全部完成了
总结一下,主要同理是通过native两个方法:addJavascriptInterface和shouldOverrideUrlLoading完成js和native交互。