以编程方式重新启动React Native应用程序

64

能否在不编写任何本地代码的情况下以编程方式重新启动React Native应用程序?例如,我知道从这个问题的答案中,可以使用以下代码重新启动Android应用程序:

Intent i = getBaseContext().getPackageManager()
         .getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);

我能用React Native做同样的事情吗?


我也对iOS有同样的疑问。 - Fero
7个回答

65
如果您只想重新启动JS部分,那么可以使用React Native Restart Package。这将适用于Android和iOS系统。
如果您想要重新启动整个应用程序,则目前没有React Native软件包可用。如果您想自己创建,请查看以下链接。 构建React Native自定义Android模块 如果您在编写基本的JAVA代码方面遇到困难,可以使用React Native Create Library来生成样板文件。
更新:
从0.62版本开始,React Native已经添加了DevSettings.reload()。因此,如果您想在开发过程中以编程方式重新加载,则可以使用该方法。请注意,此方法在生产环境中不起作用! 点击此处查看文档

2
如果你能考虑使用 Expo,你可以通过 Util.reload() 来实现这个功能。https://docs.expo.io/versions/v15.0.0/sdk/util.html - sinewave440hz
5
您不再需要这个包了。 DevSettings.reload() 是从版本62开始本地支持的。这是 DevSettings 模块的文档:https://reactnative.dev/docs/devsettings#reload - Estevão Lucas
5
DevSettings 模块暴露了用于在开发中自定义开发人员设置的方法。 - ggDeGreat
10
这意味着这个API在生产环境下无法使用。 - olawalejuwonm
2
请注意,文档中提到DevSettings API仅在开发环境中运行。 - heytulsiprasad
显示剩余2条评论

32

除了以上所说的,您可以使用Codepush按如下方式重新启动应用程序:

import CodePush from 'react-native-code-push';
CodePush.restartApp();

事实上,那就是React Native Restart Package的代码来源。


2
这样重新启动似乎会泄漏内存。重复几次重新启动,应用程序将很快被杀死。仍然不确定原因。 - Cristiano Coelho
2
@CristianoCoelho 没错。根据我的经验,我也注意到它会泄漏内存。虽然我不熟悉技术细节,但我认为 react-native-restart 也可能会泄漏内存,因为它是从 codepush 中提取的。我们在 Android 上通过 codepush 进行重启后看到了更高的 OutOfMemoryErrors 发生率。 - Mike Martin

15

10
虽然这个功能可以使用,但似乎只在开发版本中有效(我猜这就是为什么它被称为DevSettings)。通过Xcode将应用程序构建到设备上可以成功,但上传存档到App Store / Test Flight时,该调用会导致应用程序崩溃。有没有其他解决方法(除了使用react-native-restart包)? - mmccaff
1
似乎这也适用于Android,我不知道它是否一直都可以或者是RN更新后才可以,但我建议你修改你的答案 - 我一开始没有使用它,因为我认为它只适用于iOS。 - MikeL
6
这在发行版中无法正常工作,但在调试模式下可以。有没有关于发行版模式的建议? - Bumuthu Dilshan
1
对于发布模式,您可以使用React Native Restart包(第一个答案)。 - Estevão Lucas

7
您可以像这样使用ReactInstanceManager
final ReactInstanceManager instanceManager = getReactInstanceManager();
instanceManager.recreateReactContextInBackground();

6
你可以按照以下步骤进行:
yarn add react-native-restart
react-native link react-native-restart

并按照以下方式使用:
import RNRestart from 'react-native-restart'; // Import package from node modules

// Immediately reload the React Native Bundle
RNRestart.Restart();

我尝试使用expo,但出现错误null is not an object (evaluating '_reactNativeRestart.default.Restart')。在没有expo的情况下,存在自动链接的问题。因此,我猜测expo使用了自动链接... - Fotios Tsakiris
1
@FotisTsakiris 自 React Native v60 起,不再需要链接。 - sajad abbasi

5
如果你正在使用Expo开发应用,你也可以使用https://docs.expo.io/versions/v38.0.0/sdk/updates/上的Updates.reloadAsync()作为替代方法。Expo中的Updates API允许你通过编程方式控制和响应应用程序的空中更新。
安装: expo install expo-updates 使用:
import * as Updates from 'expo-updates';

...

async function reloadApp () {
    await Updates.reloadAsync();
}

这是因为我的资产没有被加载。 - EMATade

3

8
它能在发布版本中运行吗?还是只能在调试/开发版本中运行? - ryzhak
2
The DevSettings module exposes methods for customizing settings for developers in development. - ggDeGreat
2
@ggDeGreat,有没有办法进行离线模式? - ThinkAndCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接