android - programacion - Cómo programar un trabajo de fondo en un momento específico en reaccionar nativo
manual programacion android español pdf (3)
Crea una clase y agrega esto a tu clase
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
}
});
}
}
Quiero ejecutar alguna Tarea T a una hora específica en un día en segundo plano para reaccionar de forma nativa. Veo que es posible en Android a partir de ahora usando Headless JS . Encontré que esta biblioteca implementó esta https://github.com/vikeri/react-native-background-job y te permite ejecutar cosas en segundo plano.
Esto no es completamente lo que estoy buscando, no te permite programar una tarea T en un momento específico. ¿Alguien sabe algún trabajo alrededor de esto?
He comprobado este hilo Ejecutar código en un momento específico en Reacción nativa donde no encontré una solución a mi problema.
El código JavaScript se ejecuta en primer plano con un solo hilo. Si necesita una tarea programada en segundo plano, necesita implementar módulos nativos, como se describe en el documento RN:
https://facebook.github.io/react-native/docs/native-modules-ios.html
https://facebook.github.io/react-native/docs/native-modules-android.html
Por supuesto, se aplican todas las restricciones de la plataforma (especialmente iOS).
Encontré un problema similar, desafortunadamente, no puedes especificar algo similar a la acción CRON en RN.
Mi solución a ese problema es usar esta biblioteca https://github.com/ocetnik/react-native-background-timer y calcular la diferencia entre la hora actual y la hora programada para la tarea.
El tiempo calculado debe estar en ms, para que pueda usarlo con la función provista 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);
Ejemplo:
Digamos que quiere programar la tarea para mañana a las 16, en componentDidMount
puede calcular el tiempo entre ahora y la fecha programada. Usemos el moment
para eso:
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);
}
Tenga en cuenta que esta solución es vulnerable a que un usuario cambie la hora en su teléfono. La solución perfecta sería utilizar algún servicio externo para obtener el tiempo.
En segundo lugar, la aplicación debe estar al menos en segundo plano para que esto funcione.