我正在尝试使用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
,但我看不到任何警告或警告日志。
答案 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
(见上文)。