Saltar al contenido

¿Cómo ejecutar un método en segundo plano solo cuando la aplicación está abierta y en ejecución?

Hola, hallamos la solución a tu interrogante, continúa leyendo y la hallarás un poco más abajo.

Solución:

Lo que hicimos en nuestra aplicación de formularios fue utilizar Device.Timer y la clase Stopwatch que están disponibles en System.Diagnostics y Xamarin.Forms para crear un temporizador administrado muy genérico con el que pudiéramos interactuar usando onStart, onSleep y onResume. métodos en Xamarin.Forms.

Esta solución en particular no requiere ninguna lógica específica de plataforma especial, y el temporizador y el cronómetro del dispositivo no bloquean la interfaz de usuario.

using Xamarin.Forms;
using System;
using System.Linq;
using System.Diagnostics;

namespace YourNamespace

    public partial class App : Application
    
        private static Stopwatch stopWatch = new Stopwatch();
        private const int defaultTimespan = 1;

        protected override void OnStart()
        
            // On start runs when your application launches from a closed state, 

            if (!stopWatch.IsRunning)
            
                stopWatch.Start();
            

            Device.StartTimer(new TimeSpan(0, 0, 1), () =>
            
                // Logic for logging out if the device is inactive for a period of time.

                if (stopWatch.IsRunning && stopWatch.Elapsed.Minutes >= defaultTimespan)
                
                    //prepare to perform your data pull here as we have hit the 1 minute mark   

                        // Perform your long running operations here.

                        Device.InvokeOnMainThread(()=>
                            // If you need to do anything with your UI, you need to wrap it in this.
                        );

                    stopwatch.Restart();
                

                // Always return true as to keep our device timer running.
                return true;
            );
        

        protected override void OnSleep()
        
            // Ensure our stopwatch is reset so the elapsed time is 0.
            stopWatch.Reset();
        

        protected override void OnResume()
        
            // App enters the foreground so start our stopwatch again.
            stopWatch.Start();
        
    

Editar:

Para dar un poco de contexto sobre cómo funciona la solución anterior paso a paso:

La aplicación comienza desde un estado cerrado y el método ‘OnStart()’ crea nuestro Device.Timer que marca cada segundo. También pone en marcha nuestro cronómetro que cuenta hasta un minuto.

Cuando la aplicación pasa a segundo plano, activa el método ‘OnSleep’ en este punto si tuviéramos que pasar un ‘false’ valor en nuestra acción Device.StartTimer() no se iniciaría de nuevo. Entonces, en su lugar, simplemente reiniciamos nuestro cronómetro listo para cuando la aplicación se abra nuevamente.

Cuando la aplicación vuelve al primer plano, activa el método ‘OnResume’, que simplemente inicia el cronómetro existente.

Edición de 2018:

Esta respuesta todavía tiene algunos méritos incluso en 2018, pero principalmente para situaciones muy específicas. Hay mejores formas específicas de la plataforma para replicar esta funcionalidad incluso en Xamarin.Forms. Lo anterior sigue siendo una forma independiente de la plataforma para realizar una tarea después de un período de tiempo, teniendo en cuenta la actividad/inactividad del usuario.

puedes usar esto,

 System.Threading.Tasks.Task.Run(() =>
 
      //Add your code here.
 ).ConfigureAwait(false);

Hay algunas maneras de hacer esto tanto en iOS como en Android. En Xamarin Forms, la mayor parte de esta funcionalidad cae bajo el nombre de Fondo. Hay muchos tutoriales por ahí. Este es bastante elaborado y definitivamente vale la pena echarle un vistazo:

http://arteksoftware.com/backgrounding-with-xamarin-forms/

En Android, gran parte de este trabajo se realiza en un Servicio de fondo. Para iOS busque en de larga duración o Tareas de longitud finita. Como puede ver a partir de esto, no hay una forma de Xamarin Forms de hacer esto. Deberá escribir código específico de Xamarin.Android y Xamarin.iOS.

Aquí puedes ver las comentarios y valoraciones de los usuarios

Agradecemos que quieras favorecer nuestro quehacer poniendo un comentario y puntuándolo te damos las gracias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *