如何在 RN 和 Native Android 屏幕之间保持最新关于当前堆栈的信息?

How to keep up-to-date between RN and Native Android Screen about current stack?

每当视频通知进入应用程序时,我都会触发 android activity FullScreenActivity。此屏幕显示在 react-native 之上。但是我不想在用户在特定的 react-native 屏幕上时触发此 FullScreenActivity

我们在 RN 和 android 上编码了相同的特征。我要实现

场景:

  1. 用户在屏幕 1 -> 收到通知 -> 现在触发 FullScreenActivity。
  2. 如果用户在执行上述步骤时移动到屏幕 2(如果在屏幕 2 中则不会触发),如何处理?

android 如何知道 specific screen of RN 中的用户以及 RN 应该如何知道 FullScreenActivity 当前处于活动状态?我想在两个平台之间进行单向/双向通信。

如果我没理解错的话,你可以使用Actions。

import {Actions} from 'react-native-router-flux';

Actions.currentScene;

Actions.currentScene给你活动场景

您需要创建一个具有双向绑定的 native module

  • RN 在 android 上调用的函数,每次用户更改反应本机屏幕时调用

  • 当您收到视频通知时,您检查当前屏幕并决定是否显示 FullScreenActivity

  • An event emitted by the native module每次FullScreenActivityshows/hides,react-native可以订阅

when app is background or killed, FullScreenActivity should trigger.

我不明白这个问题,当你的应用程序被杀死时你不能present/hide/do东西

你应该在平台之间进行双向通信。我假设您知道如何在 Android.

中创建和注册您的原生模块

React-Native -> Android 通信。

本地代码:

@ReactMethod
public void setCurrentScreen(String screen) {
}

在 JS 代码中,您可以通过设置 onStateChange 属性并调用 YourNativeModule.setCurrentScreen() 方法将导航监听器附加到您的路由器。

Android -> React-Native 通信:

只需从 FullScreenActivity 向 JS 发送一个带有 activity 状态信息的事件并在 JS 中订阅事件。

    override fun onStart() {
        super.onStart()
        sendActivityStartedEvent()
    }

    override fun onStop() {
        sendActivityStoppedEvent()
        super.onStop()
    }

    private fun sendActivityStartedEvent() {
        val params = Arguments.createMap()
        params.putBoolean("active", true)
        sendEvent("activityState", params)
    }

    private fun sendActivityStoppedEvent() {
        val params = Arguments.createMap()
        params.putBoolean("active", false)
        sendEvent("activityState", params)
    }

    private fun sendEvent(eventName: String, params: WritableMap?) {
        reactNativeHost.reactInstanceManager.currentReactContext
                ?.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
                ?.emit(eventName, params)
    }

为了访问reactNativeHost,您的 FullScreenActivity 必须是 ReactActivity

的实例

JS代码:

this.subscription = DeviceEventEmitter.addListener('activityState', event => {
                     console.log(event.active)
                    });