Как быть в курсе текущего стека между RN и Native Android Screen? - PullRequest
1 голос
/ 13 июля 2020

Я вызываю android активность FullScreenActivity всякий раз, когда видео-уведомление приходит в приложение. Этот экран отображается поверх react-native. Но я не хочу запускать этот FullScreenActivity, когда пользователь находится на определенном c экране response-native.

у нас есть та же функция, закодированная на RN и android. Я хочу достичь

  • , когда приложение находится на переднем плане, а не на экране RN c, должна срабатывать FullScreenActivity.
  • , когда приложение находится на переднем плане и на экране RN c, FullScreenActivity не должен запускаться и вместо этого вызывать сцену RN.
  • , когда приложение находится в фоновом режиме или убито, FullScreenActivity должен срабатывать.

Сценарий:

  1. пользователь находится в экран 1 -> получено уведомление -> теперь запускается FullScreenActivity.
  2. Как поступить, если пользователь переходит на экран 2 (не запускается, если на экране 2) во время выполнения вышеуказанного шага?

Как android узнать пользователя в specific screen of RN и как RN должен знать, что FullScreenActivity в настоящее время активен? Я хочу установить одностороннюю / двустороннюю связь между обеими платформами.

Ответы [ 3 ]

2 голосов
/ 20 июля 2020

Вам необходимо создать собственный модуль с двусторонней привязкой:

  • Функция, которую RN вызывает на android, вызываемую каждый раз, когда пользователь изменить собственный экран реакции

  • Когда вы получаете видео-уведомление, вы проверяете текущий экран и решаете, должен ли FullScreenActivity отображаться или нет

  • Событие, генерируемое родным модулем каждый раз, когда FullScreenActivity показывает / скрывает, и react-native может подписаться на него

когда приложение находится в фоновом режиме или убито, FullScreenActivity должен сработать.

Я не понимаю вопроса, вы не можете отображать / скрывать / делать что-то, когда ваше приложение убито

2 голосов
/ 20 июля 2020

Вы должны установить двустороннюю связь между платформами. Я полагаю, вы знаете, как создавать и регистрировать свои собственные модули в Android.

React-Native -> Android коммуникации.

Собственный код:

@ReactMethod
public void setCurrentScreen(String screen) {
}

В коде JS вы можете прикрепить прослушиватель навигации к маршрутизатору с помощью настройки onStateChange prop и вызова метода YourNativeModule.setCurrentScreen().

Android -> Связь React-Native:

Просто отправьте событие из FullScreenActivity на JS с информацией о состоянии активности и подпишитесь на события в 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)
                    });
0 голосов
/ 13 июля 2020

Если я правильно понимаю, вы можете использовать Действия.

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

Actions.currentScene;

Actions.currentScene дает вам активную сцену.

...