当app在后台时,如何使用Headless任务每15秒获取一次数据?

时间:2016-12-03 10:40:47

标签: java android react-native

我需要我的应用程序每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已经完成了。

2 个答案:

答案 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 这解决了问题所在。