React native React Native-Headless JS示例

React native React Native-Headless JS示例,react-native,React Native,关于这一点的react本地文档似乎并不完整。我遵循的是这本指南,它似乎并没有把我带到任何地方: 我应该把.java文件放在哪里? 我应该如何启动任务?将.java文件放入您的项目中。例如/app/src/main/java/com/alex/app/service/ 当您想要执行特定的JavaScript代码而不显示ReactRootView时,您可以使用自定义HeadlessJsTaskService 要启动任务,只需调用startService(newintent(this,MyTaskS

关于这一点的react本地文档似乎并不完整。我遵循的是这本指南,它似乎并没有把我带到任何地方:

我应该把.java文件放在哪里?
我应该如何启动任务?

将.java文件放入您的项目中。例如
/app/src/main/java/com/alex/app/service/

当您想要执行特定的JavaScript代码而不显示
ReactRootView
时,您可以使用自定义
HeadlessJsTaskService

要启动任务,只需调用startService(newintent(this,MyTaskService.class))例如,来自其他服务,甚至来自某个活动

提示: 我更改了教程的
getTaskConfig()
方法,因此它允许空的附加:

@Override
@Nullable
protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
    Bundle extras = intent.getExtras();
    WritableMap data = extras != null ? Arguments.fromBundle(extras) : null;
    return new HeadlessJsTaskConfig(
            "SomeTaskName",
            data,
            5000);
}

或者至少更改它,这样它就不会在没有提供额外功能的情况下自动失败。

我遇到了与您相同的问题。我是本地安卓开发者的新手,我遵循了文档,但它们对我不起作用。事实证明,我误解了这一点,认为我可以从我的react本机代码开始实际的任务。不过,它不是那样工作的。您编写了要在任务启动时运行的JavaScript代码,但需要从本机代码启动该任务。因此,您已经完成的步骤是设置任务,但没有任何东西告诉他们开始

我将以我的项目为例:

在我的JavaScript中:

    /* 
      This code basically registers WHAT javascript code
      I want to call when the 'disconnect' service is started
    */

    const disconnectTask = () => async () => {
      if (connectionIsActive) {
        user.goOffline();
      }
    };

    AppRegistry.registerHeadlessTask('disconnect', disconnectTask);
然后我在这里创建了java文件:

projectroot/android/app/src/main/java/com/mycompany/app/ForceOfflineService.java

package com.mycompany.app;
import android.content.Intent;
import android.os.Bundle;
import com.facebook.react.HeadlessJsTaskService;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.jstasks.HeadlessJsTaskConfig;
import com.facebook.react.bridge.WritableMap;
import javax.annotation.Nullable;

public class ForceOfflineService extends HeadlessJsTaskService {
  @Override
  @Nullable
  protected HeadlessJsTaskConfig getTaskConfig(Intent intent) {
      Bundle extras = intent.getExtras();
      // WritableMap data = extras != null ? Arguments.fromBundle(extras) : null;
      
      // ---- EDIT ---- the line above no longer works, since null is not an accepted value anymore.
      WritableMap data = extras != null ? Arguments.fromBundle(extras) : Arguments.createMap();

      // Make sure that the string below ("disconnect" in this case)
      // matches the string used to register the task in your JS

      return new HeadlessJsTaskConfig(
              "disconnect",
              data,
              5000);
  }
}
然后在你的android清单中 (我的在这里:projectroot/android/app/src/main/AndroidManifest.xml) 必须在应用程序标记内注册服务

<manifest>
  <application>

    <!-- other existing configuration -->

    <service android:name=".ForceOfflineService" />
  </application>
</manifest>

就这样

我现在也在解决这个问题。你有什么进展吗?我想你可以用这个号码开始这个任务。我为Android实现了一个带有后台服务的本机模块。这相当直截了当。我会在某个时候再试一次,并在这里发布我的发现。想分享一下你做的这个安卓服务吗?因为我做了类似的事情:D@Alex您是否成功地以无头方式集成react native?我的回答帮你设置了吗?你能补充更多细节吗?现在还不清楚如何为初学者实际使用headless js
 override fun onStop() {
    super.onStop()

    Handler(Looper.getMainLooper()).postDelayed(Runnable {
      val service = Intent(applicationContext, ForceOfflineService::class.java)
      applicationContext.startService(service)
    }, IDLE_TIME_BEFORE_DISCONNECT)
  }