Как запланировать фоновое задание в определенное время в

Я хочу выполнить некоторую задачу T в определенное время за один день в фоновом режиме в ответ на native. Я вижу, что в андроиде теперь можно использовать Headless JS. Я обнаружил, что эта библиотека реализовала этот https://github.com/vikeri/react-native-background-job и позволяет выполнять материал в фоновом режиме.

Это не совсем то, что я ищу, это не позволяет запланировать задачу T в определенное время. Кто-нибудь знает какую-нибудь работу для этого?

Я проверил этот поток Выполняю код в определенное время в ответном native, где я не нашел решение моей проблемы.

Ответы

Ответ 1

Я столкнулся с подобной проблемой, к сожалению, вы не можете указать что-то похожее на действие CRON в RN.

Мое решение этой проблемы - использовать эту библиотеку https://github.com/ocetnik/react-native-background-timer и рассчитать разницу между текущим временем и временем, на которое запланирована задача.

Вычисленное время должно быть в мс, поэтому вы можете использовать его с предоставленной функцией setTimeout:

// Start a timer that runs once after X milliseconds
const timeoutId = BackgroundTimer.setTimeout(() => {
  // this will be executed once after 10 seconds
  // even when app is the the background
  console.log('tac');
}, 10000);

Пример:

Предположим, вы хотите запланировать задачу на завтра в 16-м, в componentDidMount вы можете рассчитать время между текущей и запланированной датой. Для этого используйте moment:

componentDidMount(){
  const scheduledDate = 
   moment().add(1,'d').set({hour:16,minute:0,second:0,millisecond:0})
  const diffTime = scheduledDate.diff(moment())
  this.timeoutId = BackgroundTimer.setTimeout(() => {
    console.log('tac');
  }, diffTime);
}

componentWillUnmount(){
 BackgroundTimer.clearTimeout(this.timeoutId);
}

Обратите внимание, что это решение уязвимо для пользователя, изменяющего время на своем телефоне. Идеальное решение - использовать некоторую внешнюю службу для получения времени.

Во-вторых, приложение должно быть по крайней мере в фоновом режиме для этого.

Ответ 2

JavaScript-код работает на переднем плане только с одним потоком. Если вам нужна запланированная фоновая задача, вам необходимо реализовать собственные модули, как описано в документе RN:

https://facebook.github.io/react-native/docs/native-modules-ios.html

https://facebook.github.io/react-native/docs/native-modules-android.html

Конечно, применяются все ограничения платформы (особенно iOS).

Ответ 3

Создайте класс и добавьте его в свой класс

public static final long NOTIFY_INTERVAL = 10 * 1000; // 30 minutes

@Override
    public void onCreate() {
        // cancel if already existed
        if (mTimer != null) {
            mTimer.cancel();
        } else {
            // recreate new
            mTimer = new Timer();
        }
        // schedule task
        mTimer.scheduleAtFixedRate(new TimeDisplayTimerTask(), 0, NOTIFY_INTERVAL);
    }

class TimeDisplayTimerTask extends TimerTask {
        @Override
        public void run() {
            // run on another thread
            mHandler.post(new Runnable() {
                @Override
                public void run() {
                    // code
                }
            });
        }
    }