我需要我的应用程序每15秒对服务器执行一次请求,只有当应用程序处于后台时才需要。 我似乎无法找到任何教程解释如何使用无头任务来完成所有示例的完整任务。现在我只是尝试做以下事情。
AppRegistry.registerHeadlessTask('PracticeTask', () => async (data) => {
const { dispatch, getState } = data;
console.log(dispatch, getState);
return true;
});
AppState.addEventListener('change', nextAppState => {
if(nextAppState === "background"){
AppRegistry.startHeadlessTask(1, 'PracticeTask', { dispatch: store.dispatch, getState: store.getState });
}
});
我的Java文件如下所示:
package com.project;
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;
public class PracticeTaskService extends HeadlessJsTaskService {
@Override
protected HeadlessJsTaskConfig getTaskConfig(Intent intent){
Bundle extras = intent.getExtras();
if(extras != null){
return new HeadlessJsTaskConfig(
"PracticeTask",
Arguments.fromBundle(extras),
50
);
}
return null;
}
}
当应用程序进入后台时,它只会崩溃。但是console.log已经完成了。
答案 0 :(得分:1)
使用 AlarmManager API。具体结帐 Scheduling repeated Alarms 。
简单示例 -
public void startAlarm(Context context) {
Intent intent = new Intent(context, SyncService.class);
PendingIntent sender = PendingIntent.getService(context, 0, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP,
10 min, 20 min, sender);
}
(来自Docs) 注意:从API 19(KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续查看之前的行为,其中所有警报都在请求时准确传递。
使用新的 JobScheduler API (较旧的(Lollipop - )等同于AlarmManager)
确保您通过Android清单注册。
简单示例 -
/**
* JobService to be scheduled by the JobScheduler.
* Requests scheduled with the JobScheduler call the "onStartJob" method
*/
public class TestJobService extends JobService {
private static final String TAG = "SyncService";
@Override
public boolean onStartJob(JobParameters params) {
// fake work
Log.i(TAG, "on start job: " + params.getJobId());
return true;
}
@Override
public boolean onStopJob(JobParameters params) {
return true;
}
}
答案 1 :(得分:1)
我找到了https://github.com/ocetnik/react-native-background-timer 这解决了问题所在。