如何解决使用 android WorkManager 响应 Native HeadlessJs 任务调用
我正在使用 Android WorkManager 创建一个 React Native 后台同步任务。 WorkManager 类中的 doWork 方法会定期正确调用。我面临的问题是如何从 doWork 方法调用 react native 函数。 在我当前的实现中,没有调用 JavaScript 函数。
React Native 中的 Headless Task
// index.js
AppRegistry.registerHeadlessTask('SyncHeadlessTask',() => SyncHeadlessTask);
// SyncHeadlessTask.js
module.exports = async (taskData) => {
console.log('task running');
};
我在 Java 中的 HeadlessTask
public class SyncHeadlessTaskService extends HeadlessJsTaskService {
@Override
protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
Bundle extras = intent.getExtras();
if (extras != null) {
return new HeadlessJsTaskConfig(
"SyncHeadlessTask",Arguments.fromBundle(extras),10000,// timeout for the task
true // optional: defines whether or not the task is allowed in foreground. Default is false
);
}
return null;
}
}
我的工人
public class SyncWorker extends Worker {
private static final String TAG = "SyncWorker";
public SyncWorker(@Nonnull Context context,@Nonnull WorkerParameters workerParams) {
super(context,workerParams);
}
@Nonnull
@Override
public Result doWork() {
return Result.success();
}
}
我的模块
public class SyncModule extends ReactContextBaseJavaModule {
private static final String MODULE_NAME = "SyncManager";
private Context mContext;
private PeriodicWorkRequest workRequest;
private static final String TAG = "SyncModule";
SyncModule(@Nonnull ReactApplicationContext reactContext) {
super(reactContext);
mContext = reactContext;
workRequest = new PeriodicWorkRequest.Builder(SyncWorker.class,15,TimeUnit.MINUTES).build();
}
@ReactMethod
public void startSync() {
WorkManager.getInstance().enqueueUniquePeriodicWork("SyncWork",ExistingPeriodicWorkPolicy.KEEP,workRequest);
}
@ReactMethod
public void stopSync() {
WorkManager.getInstance().cancelUniqueWork("SyncWork");
}
@Nonnull
@Override
public String getName() {
return MODULE_NAME;
}
}
我的包裹
public class SyncPackage implements ReactPackage {
@Nonnull
@Override
public List<NativeModule> createNativeModules(@Nonnull ReactApplicationContext reactContext) {
List<NativeModule> modules = new ArrayList<>();
modules.add(new SyncModule(reactContext));
return modules;
}
@Nonnull
@Override
public List<ViewManager> createViewManagers(@Nonnull ReactApplicationContext reactContext) {
return Collections.emptyList();
}
}
解决方法
您需要将任务作为服务启动:
@Nonnull
@Override
public Result doWork() {
Intent service = new Intent(getApplicationContext(),SyncHeadlessTaskService.class);
Bundle bundle = new Bundle();
bundle.putString("foo","bar");
service.putExtras(bundle);
getApplicationContext().startService(service);
return Result.success();
}
不要忘记配置您的 AndroidManifest:
<service android:name="your.package.SyncHeadlessTaskService" />
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。