简体   繁体   中英

React Native background job at midnight

I was wondering if there is a way to run some Javascript code at midnight if the app is in background/foreground state and I found out there are some npm packages out there for React Native that lets you schedule background jobs that are executed at a set interval, but that wasn't what I was looking for so I decided to use the Headless Js API from React Native, but I couldn't get it to execute. I tried creating the service:

package com.backgroundspecificjob;

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;

import javax.annotation.Nullable;

public class MidnightTask extends HeadlessJsTaskService {

    @Override
    protected @Nullable HeadlessJsTaskConfig getTaskConfig(Intent intent) {
        Bundle extras = intent.getExtras();
        if(extras != null) {
            return new HeadlessJsTaskConfig(
                    "MidnightTask",
                    Arguments.fromBundle(extras),
                    5000
            );
        }
        return null;
    }
}

then setting up a receiver:

package com.backgroundspecificjob;

import android.app.ActivityManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
;
import com.facebook.react.HeadlessJsTaskService;

import java.util.List;

public class MidnightReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(final Context context, final Intent intent) {
        final String action = intent.getAction();
        if(!isAppOnForeground(context) && Intent.ACTION_DATE_CHANGED.equals(action)) {
            Intent serviceIntent = new Intent(context, MidnightTask.class);
            serviceIntent.putExtra("midnight", true);
            context.startService(serviceIntent);
            HeadlessJsTaskService.acquireWakeLockNow(context);
        }
    }

    private boolean isAppOnForeground(Context context) {
        ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> appProcesses =
                activityManager.getRunningAppProcesses();
        if (appProcesses == null) {
            return false;
        }
        final String packageName = context.getPackageName();
        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            if (appProcess.importance ==
                    ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
                    appProcess.processName.equals(packageName)) {
                return true;
            }
        }
        return false;
    }
}

and at last setting an intent as well as the service in Androidmanifest.xml:

<service 
     android:name=".MidnightTask" 
     android:enabled="true" 
     android:exported="true"/>
        <receiver 
            android:name=".MidnightReceiver" 
            android:enabled="true" 
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.DATE_CHANGED" />
            </intent-filter>
        </receiver>

But it seems that if I change the date to 23:59 and then wait for it to be 00:00 the intent is not triggered and furthermore the service is not called. I also registered the headless task in AppRegistry:

AppRegistry.registerHeadlessTask('MidnightTask', () =>
  require('./onMidnightClear'),
);

I can't get the code to work and I don't quite understand why this is not working. If anyone knows the solution to my problem please let me know:)

I was searching for a solution to this problem as well and there didn't seem to be any packages out there to solve this. So we created one: https://github.com/ravnhq/react-native-midnight

react-native-midnight subscribes to native api's and fires event listeners when the day has changed whether it be from a timezone change or from crossing the midnight threshold.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM