React Native Android,由于来自后台状态而同时运行的多个应用程序实例以前没有杀死该应用程序
下面是重现错误的过程 发生在我的项目v0.29中,但我刚刚在v0.33上测试了一个新的init,它的行为方式相同 当应用程序运行时,按下设备/模拟器的home(主页)按钮并单击桌面图标打开应用程序,此处发生的情况是,应用程序重新启动安装组件,之前没有卸载组件,如果您多次这样做,会导致应用程序运行的多个实例 然后,如果您按下设备后退按钮,它将杀死并卸载顶级实例,让您使用上一个实例,直到最后一个实例卸载,它将转到桌面 在此之后,如果您像最初按home按钮一样退出应用程序,并通过单击桌面图标打开应用程序,则不会重新启动应用程序并再次装载它,从此时起操作正常。 同样,如果应用程序第一次启动后,您使用“后退”按钮退出,则之后“主页”按钮将正常运行 同样,如果你实现了一个像react native activity android这样的包,以避免在按下后退按钮时杀死应用程序,那么你最终会运行多个应用程序 我不知道android,当应用程序被关闭后会发生什么,如果你使用home按钮将应用程序发送到后台,它会正常工作吗 有什么办法可以解决这个问题,所以将应用程序发送到后台并重新打开它不会装载多个应用程序 如果出于定位/通知目的,我需要在后台运行应用程序,假设我无法解决此问题,但我可以处理事件侦听器,这样它们就不会被执行多次。同时安装多个应用程序对性能/内存的影响有多大React Native Android,由于来自后台状态而同时运行的多个应用程序实例以前没有杀死该应用程序,android,react-native,react-native-android,Android,React Native,React Native Android,下面是重现错误的过程 发生在我的项目v0.29中,但我刚刚在v0.33上测试了一个新的init,它的行为方式相同 当应用程序运行时,按下设备/模拟器的home(主页)按钮并单击桌面图标打开应用程序,此处发生的情况是,应用程序重新启动安装组件,之前没有卸载组件,如果您多次这样做,会导致应用程序运行的多个实例 然后,如果您按下设备后退按钮,它将杀死并卸载顶级实例,让您使用上一个实例,直到最后一个实例卸载,它将转到桌面 在此之后,如果您像最初按home按钮一样退出应用程序,并通过单击桌面图标打开应
谢谢事实证明,使用BackAndroid并从back press处理程序返回
false
会导致组件卸载。当应用程序返回前台时,需要重新构建这些组件
我尝试将android:launchMode=“singleTask”
添加到AndroidManifest.xml
中的活动中,但没有成功。我的解决方案是,使用ActivityAndroid.moveTaskToBack()
将应用程序放在后台,并且永远不要返回false
。您的处理程序将如下所示:
handleBackPress() {
if (this.navigator) {
if (this.navigator.getCurrentRoutes().length > 1) {
this.navigator.pop();
} else {
ActivityAndroid.moveTaskToBack();
}
}
return true;
};
<manifest>
...
<application>
...
<activity ... android:launchMode="singleInstance">
</activity>
</application>
</manifest>
注意:此插件的作者尚未更新其与React Native 0.29.0或更高版本的兼容性。在本文撰写的这个时候,我的解决方案尚未完成。实际上,您可以实现自己的模块来解决这个问题。这很简单。将这段代码添加到一个本机模块中
@ReactMethod
public void moveTaskToBack(Callback cb) {
Activity activity = getCurrentActivity();
boolean wasMoved = activity.moveTaskToBack(true);
if (cb != null) {
cb.invoke(wasMoved);
}
}
然后,您可以按照Ryan的建议处理onBackPress事件。始终返回true,并在需要时调用moveTaskToPack()。此错误是由于每个应用程序创建多个活动而导致的,这会导致多个根组件同时运行 对于大多数人来说,一个似乎有效的解决方案是在
AndroidManifest.xml
中将launchMode
设置为singleInstance
,如下所示:
handleBackPress() {
if (this.navigator) {
if (this.navigator.getCurrentRoutes().length > 1) {
this.navigator.pop();
} else {
ActivityAndroid.moveTaskToBack();
}
}
return true;
};
<manifest>
...
<application>
...
<activity ... android:launchMode="singleInstance">
</activity>
</application>
</manifest>
...
在IOS而非android上发生在我身上