タスクTを1日の特定の時間にバックグラウンドでバックグラウンドで実行したい。 Android現在使用している Headless JS で可能であることがわかりました。このライブラリがこれを実装していることがわかりました https://github.com/ vikeri/react-native-background-job を使用すると、バックグラウンドで実行できます。
これは私が探しているものではありません。特定の時間にタスクTをスケジュールすることはできません。誰かがこれの回避策を知っていますか?
私はこのスレッドをチェックしました react nativeで特定の時間にコードを実行します 私は問題の解決策を見つけられませんでした。
同様の問題に遭遇しましたが、残念ながら、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番目の注意点は、これが機能するためには、アプリが少なくともバックグラウンドにある必要があります。
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)が適用されます。
クラスを作成し、クラスに追加します
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
}
});
}
}