我该怎么做才能让Headless JS服务在android的前台运行



我浏览了React Native Headless JS的官方文档。在注意事项中,提到如果应用程序尝试在前台运行任务,应用程序将崩溃。还有人提到,有一种方法可以解决这个问题。请建议一种方法,以便当应用程序处于前台时,我可以使用Headless JS在UI线程之外的另一个线程中完成繁重的任务。

即使从当前活动的"活动"启动,使用HeadlessJsTaskService也很有效。你试过了吗,它坏了?

编辑

我看了一下它们的实施情况。您的应用程序将在以下情况下崩溃:

if (reactContext.getLifecycleState() == LifecycleState.RESUMED &&
!taskConfig.isAllowedInForeground()) { //crash }

(参见ReactContext)

这意味着您可以将HeadlessJsTaskService中的HeadlessJsTaskConfig配置为allowedInForegroundtrue

例如

@Override
@Nullable
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
WritableMap data = extras != null ? Arguments.fromBundle(extras) : null;
return new HeadlessJsTaskConfig(
"FeatureExecutor",
data,
5000, 
true /* Don't crash when running in foreground */);
}

但在我的测试用例中,这一步骤是不必要的,即使在显示ReactRootView时也是如此。我认为原因是ReactRootView有自己的ReactContext(这可能不是一个好主意)。

对于您的实现,当使用Headless JS时,您应该考虑以下内容:

allowedInForeground是否允许在应用程序处于前台时运行此任务(即当前ReactContext的主机处于恢复模式)。只有当你真的需要的时候才设置为true。注意,任务和UI代码在同一个JS线程中运行,所以做昂贵的操作会降低用户体验。

(请参阅HeadlessJsTaskConfig.java)

最新更新