React Native Android,由于来自后台状态而同时运行的几个应用程序实例,而没有杀死应用程序

Nor*_*S.M 7 android react-native react-native-android

以下是重现错误的过程.

在我的项目v0.29中发生,但我刚刚在v0.33上测试了init,它的行为方式相同.

当应用程序运行时,按下设备/模拟器的主页按钮并通过单击桌面图标打开应用程序,这里发生的是应用程序重新启动安装组件而没有先卸载它,导致多个实例如果你多次这样做,app会运行.

在此输入图像描述

然后,如果您按下设备后退按钮,它将终止,因此卸载顶级实例,让您使用前一个实例,直到最后一个卸载并且它将转到桌面.

在此输入图像描述

在此之后如果您退出应用程序,就像您最初按下主页按钮并通过单击桌面图标打开它,这将不会重新启动应用程序再次安装它,从这一刻开始正确行事.同样,如果应用程序首次启动,则使用后退按钮退出,之后主页按钮将表现正常.

同样,如果你实现像react-native-activity-android这样的软件包,以避免在按下后退按钮时杀死应用程序,你最终会运行多个应用程序.

在此输入图像描述

在此输入图像描述

我不知道android,当应用程序被杀死时发生了什么,如果你使用home按钮将应用程序发送到后台它可以正常工作?

任何想法如何解决这个问题,所以将应用程序发送到后台并重新打开它不会挂载多个应用程序?

如果我需要在后台运行应用程序以进行位置/通知,假设我无法解决此问题,但我可以处理事件侦听器,因此它们不会多次执行.多个应用程序同时安装的性能/内存有多糟糕?

谢谢

lau*_*ent 8

不幸的是,这个问题的最佳答案因为仅链接而被删除,所以我在这里放回信息.

此错误是由于React Native为每个应用程序创建了多个活动,这导致多个根组件同时运行.

对大多数人来说似乎有效的解决方案是设置launchModesingleInstancein AndroidManifest.xml,所以这样的事情:

<manifest>
    ...
    <application>
        ...
        <activity ... android:launchMode="singleInstance">
        </activity>
    </application>
</manifest>
Run Code Online (Sandbox Code Playgroud)

更多信息:

https://github.com/facebook/react-native/issues/10266

https://github.com/facebook/react-native/issues/7079


Rya*_* H. 2

事实证明,使用 BackAndroid 并false从后按处理程序返回会导致组件卸载。当应用程序返回前台时,需要重建这些组件。

我尝试添加android:launchMode="singleTask"到活动中AndroidManifest.xml但无济于事。我的解决方案是使用react-native-activity-android,将应用程序放在后台ActivityAndroid.moveTaskToBack()适当且从不return false。然后你的处理程序将看起来像这样:

handleBackPress() {
    if (this.navigator) {
        if (this.navigator.getCurrentRoutes().length > 1) {
            this.navigator.pop();
        } else {
            ActivityAndroid.moveTaskToBack();
        }
    }
    return true;
};
Run Code Online (Sandbox Code Playgroud)

注意:该插件的作者尚未更新它以兼容 React Native 0.29.0 或更高版本。在撰写本文时,我修复此问题的拉取请求正在等待处理。