React-Native系列Android——Native与Javascript通信原理(三)

本文深入探讨React-Native中Android端如何被动地向Javascript通信,主要分析了JavaScript请求Native并接收回调的过程,涉及callbackID的关键作用,以及从JavaScript发起请求、Native响应、Bridge中转到JavaScript接收应答的完整流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面两篇博客,详细分析了NativeJavascript通信的过程,可以满足绝大部分场景下NativeJavascript的相互调用,但是仍然有不健全的情况。

比如Javascript层要实时获取Native的一些状态,就需要Native被动地向Javascript层通信了。这个过程区别于通信第一篇中Native主动向Javascript层通信,本篇博客就来研究下这样一个被动回调的过程!

在阅读本篇博客前,希望能回顾下前两篇。

React-Native系列Android——Native与Javascript通信原理(一)
http://blog.youkuaiyun.com/megatronkings/article/details/51114278

React-Native系列Android——Native与Javascript通信原理(二)
http://blog.youkuaiyun.com/megatronkings/article/details/51138499

首先,从一个常用的场景开始分析。

假设前端开发者在Javascript的代码中想要获取APP的状态,比如APP是否是处于前台(active),还是后台(background)。大概有两种实现方式:
1、NativeAPP每次状态切换的时候,调用callFunction将最新的状态传给Javascript层,然后由Javascript缓存起来,这样开发者想要获取状态可以能直接使用这个缓存的值。
2、前端开发者在Javascript中想要获取状态时,先向Native端发起通信请求,表示想获取状态,然后由Native端把这个状态作为通信应答返给Javascript层。

这两种方案都有各自的使用性场景,并且在React-Native都有相应实现。第一种实现对开发者来说相对简单,直接取缓存值,是一个完全同步的过程。第二种实现向Native发起通信请求,需要等待Native的应答,是一个异步的过程。

第一种方案实现原理在React-Native系列Android——Native与Javascript通信原理(一)中已经详细分析过了,不再赘述,本篇博文重点来分析下第二种方案的实现原理。


1、JavaScript的请求

NativeJavaScript的通信,都是由Native主动发起,然后由JavaScript应答,但是JavaScript是无法向Native主动发起通信的。那么,JavaScript如何才能向Native发起通信请求呢?

上一篇博文中讲过,JavaScript应答Native是通过将应答数据包装成JSON格式,然后在flushedQueue() 返给Bridge再返给Native的。如果JavaScript在这个应答信息加入通信请求的标识,那么Native在解析应答信息时发现了其中包含JavaScript的通信标识,然后Native来应答这个请求,这样不就完成了一次JavaScript请求Native的过程吗?

第一步:在返给Native的应答信息中加入JavaScript的通信请求

同样以在Javascript中获取APP当前状态为例,示范代码如下:

var NativeModules = require('NativeModules');

var RCTAppState = NativeModules.AppState;

var logError = require('logError');

RCTAppState.getCurrentAppState(
  (appStateData) => {
     console.log('dev', 'current state: ' + appStateData.app_state);
  },
  logError
);

前一篇博文中分析过NativeModules的前世今生,它是一个动态初始化的类(具体请看前篇Native与Javascript通信原理(二),这里略过),RCTAppState.getCurrentAppState实际上是调用的是MessageQueue.js的下面这段代码:

function(...args) {
   
   
   let lastArg = args.length > 0 ? args[args.length - 1] : null;
   let secondLastArg = args.length > 1 ? args[args.length - 2] : null;
   let hasSuccCB = typeof lastArg === 'function';
   let hasErrorCB = typeof secondLastArg === 'function';
   hasErrorCB && invariant(hasSuccCB, 'Cannot have a non-function arg after a function arg.');
   let numCBs = hasSuccCB + hasErrorCB;
   let onSucc = hasSuccCB ? lastArg : null;
   let onFail = hasErrorCB ? secondLastArg : null;
   args = args.slice(0, args.length - numCBs);
   return self.__nativeCall(module, method, args, onFail, onSucc);
};

这里面参数args具体化有两个,一个是lambda表达式回调函数,一个是logError,都

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值