gpt4 book ai didi

android - 使用 android WorkManager 响应 Native HeadlessJs 任务调用

转载 作者:行者123 更新时间:2023-12-04 17:22:10 24 4
gpt4 key购买 nike

我正在使用 Android WorkManager 创建一个 React Native 后台同步任务。 WorkManager 类中的 doWork 方法会定期正确调用。我面临的问题是如何从 doWork 方法调用 react native 函数。
在我当前的实现中,没有调用 JavaScript 函数。
React Native 中的 headless 任务

// 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;
}
}
我的 worker
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" />

关于android - 使用 android WorkManager 响应 Native HeadlessJs 任务调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65547466/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com