如何在React Native中安排后台作业以特定时间运行

23
我想在React Native中以后台方式在特定时间执行一些任务T。 我发现,目前在Android上使用Headless JS是可能的。 我发现这个库实现了这个功能 https://github.com/vikeri/react-native-background-job 并允许您在后台执行任务。
但这并不完全符合我的需求,它不能让您在特定时间安排任务T。 有人知道任何解决方法吗?
我已经检查过这个线程 Execute code at specific time in react native ,但没有找到解决我的问题的方案。
3个回答

21

我遇到了类似的问题,不幸的是,在 RN 中不能指定类似 CRON 动作的东西。

我的解决方案是使用这个库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);
}
请注意,这种解决方案容易受到用户更改手机时间的影响。完美的解决方案是使用一些外部服务来获取时间。
第二点需要注意的是,该应用程序至少需要在后台运行才能正常工作。

可能已经有些晚了,但这仍然是最好的解决方式吗? - Ahsan Sohail
这个库似乎在Android中使用了唤醒锁,而且当应用程序在后台时没有释放。这可能会耗尽电池。这仍然是最好的解决方案吗? - Nabeel K
此内容与编程有关:这仅用于在AppState处于后台|活动状态下运行任务,而不是在关闭状态下。 - Karthikeyan Ganesan

1

0
创建一个类并将其添加到您的类中。
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
                }
            });
        }
    }

将以下代码放置在您想要在后台运行的服务类中。 - Vijay Chaudhary
这是Java,不是JavaScript... - ValiSpaceProgramming

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接