如何在 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 上编码了相同的特征。我要实现
- 当应用处于前台且不在 RN 特定屏幕中时,应触发 FullScreenActivity。
- 当应用处于前台且在 RN 特定屏幕中时,FullScreenActivity 不应触发并改为调用 RN 场景。
- 当应用程序处于后台或被终止时,应触发 FullScreenActivity。
场景:
- 用户在屏幕 1 -> 收到通知 -> 现在触发 FullScreenActivity。
- 如果用户在执行上述步骤时移动到屏幕 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每次FullScreenActivity
shows/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)
});
每当视频通知进入应用程序时,我都会触发 android activity FullScreenActivity
。此屏幕显示在 react-native 之上。但是我不想在用户在特定的 react-native 屏幕上时触发此 FullScreenActivity
。
我们在 RN 和 android 上编码了相同的特征。我要实现
- 当应用处于前台且不在 RN 特定屏幕中时,应触发 FullScreenActivity。
- 当应用处于前台且在 RN 特定屏幕中时,FullScreenActivity 不应触发并改为调用 RN 场景。
- 当应用程序处于后台或被终止时,应触发 FullScreenActivity。
场景:
- 用户在屏幕 1 -> 收到通知 -> 现在触发 FullScreenActivity。
- 如果用户在执行上述步骤时移动到屏幕 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每次
FullScreenActivity
shows/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)
});