Android与RN层的交互通信

一、流程概述

下面是Android与RN层的交互通信的一般流程:

步骤 Android端 RN端
1 注册模块、方法和事件监听
2 调用Android方法
3 接收到RN调用请求 处理RN调用请求
4 执行相应的逻辑
5 返回结果给RN 接收结果并处理

二、具体步骤及代码实现

1. 注册模块、方法和事件监听

首先,在Android端需要注册模块、方法和事件监听,以便RN可以调用。可以将这些注册操作放在Application的onCreate方法中。

// 注册模块
ReactContextBaseJavaModule module = new MyModule(reactContext);
reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher()
    .addListener(module);

// 注册方法
ReactContextBaseJavaModule module = reactContext.getNativeModule(MyModule.class);
module.addLifecycleEventListener(module);

// 注册事件监听
EventEmitter emitter = reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class);
emitter.addListener(new MyEventListener());

2. 调用Android方法

在RN端,可以直接调用Android的方法。假设我们要调用一个名为doSomething的方法。

import { NativeModules } from 'react-native';

NativeModules.MyModule.doSomething();

3. 处理RN调用请求

Android端需要接收并处理RN的调用请求。在MyModule类中,可以使用@ReactMethod注解来标记可供RN调用的方法。

public class MyModule extends ReactContextBaseJavaModule {
    // ...

    @ReactMethod
    public void doSomething() {
        // 执行相应的逻辑
        // ...

        // 返回结果给RN
        WritableMap params = Arguments.createMap();
        params.putString("result", result);
        sendEvent("EventName", params);
    }

    // 发送事件给RN
    private void sendEvent(String eventName, @Nullable WritableMap params) {
        reactContext.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
            .emit(eventName, params);
    }
}

4. 返回结果给RN

在Android端执行完相应的逻辑后,可以通过发送事件的方式将结果返回给RN端。在上述代码中,使用了sendEvent方法发送名为EventName的事件,并携带了一个名为result的参数。

5. 接收结果并处理

在RN端,可以通过给事件添加监听器来接收Android端发送的结果。假设我们要接收名为EventName的事件结果。

import { NativeEventEmitter, NativeModules } from 'react-native';

const myModuleEmitter = new NativeEventEmitter(NativeModules.MyModule);
myModuleEmitter.addListener('EventName', (result) => {
    // 处理结果
    console.log(result);
});

三、序列图

sequenceDiagram
    participant Android
    participant RN

    Android ->> RN: 注册模块、方法和事件监听
    RN ->> Android: 调用Android方法
    Android ->> RN: 处理RN调用请求
    Android ->> Android: 执行相应的逻辑
    Android ->> RN: 返回结果给RN
    RN ->> RN: 接收结果并处理

四、状态图

stateDiagram
    [*] --> 注册模块、方法和事件监听
    注册模块、方法和事件监听 --> 调用Android方法
    调用Android方法 --> 处理RN调用请求
    处理RN调用请求 --> 执行相应的逻辑
    执行相应的逻辑 --> 返回结果给RN
    返回结果给RN --> [*]

通过以上步骤,我们可以实现Android与RN层的交互通信。在Android端,我们注册了模块、方法和事件监听,在RN端可以直接调用Android的方法,Android端接收到调用请求后执行相应的逻辑,并将结果通过发送事件的方式返回给RN端,RN端可以接收到结果并进行处理。这样,Android与RN之间的通信就实现了。