web-dev-qa-db-ja.com

反応ネイティブで特定の時間にバックグラウンドジョブをスケジュールする方法

タスクTを1日の特定の時間にバックグラウンドでバックグラウンドで実行したい。 Android現在使用している Headless JS で可能であることがわかりました。このライブラリがこれを実装していることがわかりました https://github.com/ vikeri/react-native-background-job を使用すると、バックグラウンドで実行できます。

これは私が探しているものではありません。特定の時間にタスクTをスケジュールすることはできません。誰かがこれの回避策を知っていますか?

私はこのスレッドをチェックしました react nativeで特定の時間にコードを実行します 私は問題の解決策を見つけられませんでした。

20
N Sharma

同様の問題に遭遇しましたが、残念ながら、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);
}

このソリューションは、ユーザーが電話の時刻を変更することに対して脆弱であることに注意してください。完璧な解決策は、外部サービスを使用して時間を取得することです。

2番目の注意点は、これが機能するためには、アプリが少なくともバックグラウンドにある必要があります。

15
jmac

JavaScriptコードは、1つのスレッドのみでフォアグラウンドで実行されます。スケジュールされたバックグラウンドタスクが必要な場合は、RNドキュメントで説明されているように、ネイティブモジュールを実装する必要があります。

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

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

もちろん、すべてのプラットフォーム制限(特にiOS)が適用されます。

2
Alt Eisen

クラスを作成し、クラスに追加します

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
                }
            });
        }
    }
0
vijay chaudhary