以编程方式重新启动React Native App

Ada*_*ela 25 android ios react-native

是否可以以编程方式重新启动React Native应用程序而无需编写任何本机代码?

例如,我从这个问题的答案中知道我可以重启Android应用程序:

Intent i = getBaseContext().getPackageManager()
         .getLaunchIntentForPackage( getBaseContext().getPackageName() );
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

我可以用React Native做同样的事吗?

Sri*_*man 24

如果只想重新启动JS部分,则可以使用React Native Restart Package.这适用于Android和iOS.

如果要重新启动整个应用程序,目前还没有反应原生包.如果您想自己创建,请检查以下链接

为React Native构建自定义Android模块

如果您在编写基本JAVA代码时遇到困难,可以使用React Native Create Library生成样板

  • “DevSettings 模块公开了为开发人员在开发中自定义设置的方法。” (4认同)
  • 所以这意味着,这个 api 在生产环境中不起作用 (4认同)
  • 如果您/可以考虑使用 Expo,您可以使用 Util.reload() 来实现这一点。https://docs.expo.io/versions/v15.0.0/sdk/util.html (2认同)
  • expo reload 方法已更改为 `Expo.Updates.reload()` (2认同)
  • 您不再需要这个包了。`DevSettings.reload()` 是 62+ 原生的。这是 DevSettings 模块的文档 https://reactnative.dev/docs/devsettings#reload (2认同)
  • 请注意,文档中提到的“DevSettings” API 仅在开发中有效。 (2认同)

Mik*_*tin 13

除了上面所说的,你可以使用Codepush重新启动应用程序,如下所示:

import CodePush from 'react-native-code-push';
CodePush.restartApp();
Run Code Online (Sandbox Code Playgroud)

事实上,这就是React Native Restart Package从中获取代码的地方.

  • 像这样重新启动似乎会泄漏内存。重新启动几次,应用程序就会很快被杀死。仍然不知道为什么。 (2认同)
  • @CristianoCoelho 是的。根据我的经验,我还注意到它会泄漏内存。我不熟悉技术细节,但我相信react-native-restart也可能会泄漏内存,因为它是从codepush中提取的。通过 codepush 重启后,我们发现 Android 上的 OutOfMemoryErrors 发生率更高 (2认同)

Est*_*cas 12

对于 iOS,React Native 通过 "DevSettings" https://github.com/facebook/react-native/blob/75f2da23c5d557862cf4b7bcdd8a14​​45b54d1c31/React/Modules/RCTDevSettings.mm#L240-L24公开一个“重新加载”方法

import { NativeModules } from "react-native";


NativeModules.DevSettings.reload();
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效,但它似乎只适用于开发版本(我猜这就是 DevSettings 名称的由来)。通过 Xcode 构建到设备是可行的,但将存档上传到应用商店/测试飞行会在此调用中崩溃。有什么办法解决这个问题(除了使用react-native-restart包)? (5认同)
  • 这在发布模式下不起作用,但在调试模式下起作用。对于发布模式有什么建议吗? (4认同)

Moh*_*oel 6

您可以使用ReactInstanceManager这样的

final ReactInstanceManager instanceManager = getReactInstanceManager();
instanceManager.recreateReactContextInBackground();
Run Code Online (Sandbox Code Playgroud)


saj*_*asi 6

您可以执行以下操作:

yarn add react-native-restart
react-native link react-native-restart
Run Code Online (Sandbox Code Playgroud)

并使用如下:

import RNRestart from 'react-native-restart'; // Import package from node modules

// Immediately reload the React Native Bundle
RNRestart.Restart();
Run Code Online (Sandbox Code Playgroud)


Jo *_* E. 5

如果您正在使用 Expo,您还可以专门使用https://docs.expo.io/versions/v38.0.0/sdk/updates/Updates.reloadAsync()作为替代方案。expo 的APIUpdates允许您以编程方式控制和响应应用程序的无线更新。

安装

expo install expo-updates

使用

import * as Updates from 'expo-updates';

...

async function reloadApp () {
    await Updates.reloadAsync();
}
Run Code Online (Sandbox Code Playgroud)