本篇文章主要介绍了"React-Native系列Android——Native与Javascript通信原理(三)",主要涉及到javascript,Android方面的内容,对于Android开发感兴趣的同学可以参考一下:
前面两篇博客,详细分析了Native与Javascript通信的过程,可以满足绝大部分场景下Native和Javascript的相互调用,但是仍然有不健全的情况...
前面两篇博客,详细分析了Native与Javascript通信的过程,可以满足绝大部分场景下Native和Javascript的相互调用,但是仍然有不健全的情况。
比如Javascript层要实时获取Native的一些状态,就需要Native被动地向Javascript层通信了。这个过程区别于通信第一篇中Native主动向Javascript层通信,本篇博客就来研究下这样一个被动回调的过程!
在阅读本篇博客前,希望能回顾下前两篇。
React-Native系列Android——Native与Javascript通信原理(一)
http://blog.csdn.net/megatronkings/article/details/51114278
React-Native系列Android——Native与Javascript通信原理(二)
http://blog.csdn.net/megatronkings/article/details/51138499
首先,从一个常用的场景开始分析。
假设前端开发者在Javascript的代码中想要获取APP的状态,比如APP是否是处于前台(active),还是后台(background)。大概有两种实现方式:
1、Native 在APP每次状态切换的时候,调用callFunction将最新的状态传给Javascript层,然后由Javascript缓存起来,这样开发者想要获取状态可以能直接使用这个缓存的值。
2、前端开发者在Javascript中想要获取状态时,先向Native端发起通信请求,表示想获取状态,然后由Native端把这个状态作为通信应答返给Javascript层。
这两种方案都有各自的使用性场景,并且在React-Native都有相应实现。第一种实现对开发者来说相对简单,直接取缓存值,是一个完全同步的过程。第二种实现向Native发起通信请求,需要等待Native的应答,是一个异步的过程。
第一种方案实现原理在React-Native系列Android——Native与Javascript通信原理(一)中已经详细分析过了,不再赘述,本篇博文重点来分析下第二种方案的实现原理。
1、JavaScript的请求
Native与JavaScript的通信,都是由Native主动发起,然后由JavaScript应答,但是JavaScript是无法向Native主动发起通信的。那么,JavaScript如何才能向Native发起通信请求呢?
上一篇博文中讲过,JavaScript应答Native是通过将应答数据包装成JSON格式,然后在flushedQueue() 返给Bridge再返给Native的。如果JavaScript在这个应答信息加入通信请求的标识,那么Native在解析应答信息时发现了其中包含JavaScript的通信标识,然后Native来应答这个请求,这样不就完成了一次JavaScript请求Native的过程吗?
第一步:在返给Native的应答信息中加入JavaScript的通信请求
同样以在Javascript中获取APP当前状态为例,示范代码如下: