使用React Native的Android后台服务

时间:2016-11-24 08:59:18

标签: javascript android react-native

我正在尝试使用HeadlessJS API在Android中运行后台服务。我已经使用官方文档来做到这一点:

MainTask文件:

package com.test.test;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.widget.Toast;

  import com.facebook.react.HeadlessJsTaskService;
  import com.facebook.react.bridge.Arguments;
  import com.facebook.react.jstasks.HeadlessJsTaskConfig;

  public class MyTaskService extends HeadlessJsTaskService {

    @Override
    protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
      Bundle extras = intent.getExtras();

      if (extras != null) {
        return new HeadlessJsTaskConfig(
                "SomeTaskName",
                Arguments.fromBundle(extras),
                5000);
      }
      return null;
    }
}

我也注册了这样的任务:

AppRegistry.registerHeadlessTask('SomeTaskName', () => 'SomeTaskName')

SomeTaskName是一个如下所示的函数:

export async function SomeTaskName (taskData) {
  alert('Esto es una tarea en background')
}

我用来触发此后台任务的方式是使用startService方法:

  startService(new Intent(this, MyTaskService.class));

我在Android代码的不同部分尝试startService,但我看不到任何警告或警告日志。

2 个答案:

答案 0 :(得分:0)

我也试图解决这个问题。这是我到目前为止所发现的。

如果你没有把"额外的"进入你传递的Intent以启动服务,然后getTaskConfig()返回null。

"$($_.name)\$($_.user)"

删除额外检查!= null,或者在调用startService之前添加类似的东西:

protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
  Bundle extras = intent.getExtras();

  if (extras != null) {
    return new HeadlessJsTaskConfig(
            "SomeTaskName",
            Arguments.fromBundle(extras),
            5000);
  }
  return null;
}

另外,请确保将服务添加到清单。

Intent myIntent = new Intent(this, MyTaskService.class);
myIntent.putExtras("isReady",true);
startService(myIntent);

答案 1 :(得分:0)

您可以更改getTaskConfig方法以支持没有额外内容的意图:

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

您的Application类需要实现ReactApplication并返回一个初始化的ReactNativeHost,例如:

private final ReactNativeHost reactNativeHost = new ReactNativeHost(this) {
    @Override
    public boolean getUseDeveloperSupport() {
        return BuildConfig.DEBUG;
    }

    @Override
    protected List<ReactPackage> getPackages() {
        return Arrays.<ReactPackage>asList(
                new MainReactPackage()
        );
    }
};

@Override
public ReactNativeHost getReactNativeHost() {
    return reactNativeHost;
}

您还必须将服务添加到清单中,如A. Rob所说。

修改

似乎您还可以覆盖ReactApplication中的protected ReactNativeHost getReactNativeHost(),而不是实施HeadlessJsTaskService(见上文)。