[Windows Phone 8] Ejecución de código en segundo plano (I).

Hola a todos!

Hoy quiero dedicar unas líneas a hablar de la ejecución en segundo plano en Windows Phone 8. ¿Qué son? ¿Como se usan? ¿Qué restricciones tienen?

En Windows Phone 8 disponemos de cuatro opciones para ejecutar código en background:

Geolocalización en background

La primera, geolocalización en background, permite indicar al sistema que necesitamos continuar siguiendo la posición del dispositivo en toda circunstancia. Nuestra aplicación queda “viva” y seguimos recibiendo eventos de posición aunque el usuario haya cambiado a otra app. Pero no es tan bonito como parece, existen ciertas restricciones que pueden hacer que la aplicación se desactive:

  • Si el usuario no la ha usado en menos de 4 horas.
  • Si paramos de seguir la posición.
  • Si se activa el modo de ahorro de batería.
  • Si la memoria del dispositivo es baja.
  • Si otra aplicación empieza a ejecutarse en background.
  • Si el usuario desactiva los servicios de localización.

Algunas de estas situaciones podemos intentar evitarlas, por ejemplo reduciendo el consumo de la aplicación al mínimo con el objetivo de no llenar la memoria del dispositivo. Otras, lamentablemente, están fuera de nuestro control.

Para que nuestra aplicación continúe ejecutándose en background, debemos primero indicarlo al sistema. Esto lo llevaremos acabo en el archivo .xml, en el nodo DefaultTask. Tenemos que añadir el nodo BackgroundExecution:

Background execution
<DefaultTask  Name_default» NavigationPageMainPage.xaml«>
  <BackgroundExecution>
    <ExecutionType NameLocationTracking«/>
  </BackgroundExecution>
</DefaultTask>

A continuación, solo tendremos que desarrollar nuestro código normal y corriente para seguir la posición cuando esta cambie:

GpsService
Geolocator locator = new Geolocator();

public event EventHandler<PositionChangedEventArgs> PositionChanged;

public void StartTrackingLocation()
{
    locator.DesiredAccuracy = PositionAccuracy.High;
    locator.MovementThreshold = 20;
    locator.PositionChanged += locator_PositionChanged;
}

private void locator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    var tmpHandle = PositionChanged;
    if (tmpHandle != null)
    {
        App.RootFrame.Dispatcher.BeginInvoke(delegate
        {
            tmpHandle(this, args);
        });
    }
}

Y Voila!

Ahora, en nuestro ViewModel vamos a añadir código para que reciba las posiciones y las añada a una lista:

ViewModel principal
public class VMMainPage : VMBase
{
    private IGpsService gpsService;
    private ObservableCollection<string> positions = new ObservableCollection<string>();

    public VMMainPage(IGpsService gpsService)
    {
        this.gpsService = gpsService;
        this.gpsService.PositionChanged += gpsService_PositionChanged;
        this.gpsService.StartTrackingLocation();
    }

    void gpsService_PositionChanged(object sender, Windows.Devices.Geolocation.PositionChangedEventArgs e)
    {
        Positions.Add(string.Format(«{0} / {1}», e.Position.Coordinate.Latitude, e.Position.Coordinate.Longitude));
    }

    public ObservableCollection<string> Positions
    {
        get { return positions; }
        set
        {
            positions = value;
            RaisePropertyChanged();
        }
    }
}

No olvides añadir la capability ID_CAP_LOCATION a tu app y ya podrás ejecutarla. Si usas el emulador, podrás ver como al añadir puntos al mapa del simulador GPS, aparecen en una lista en pantalla. Si pruebas a volver al menú inicio, poner un punto de parada en el evento PositionChanged y añadir un nuevo punto, verás como la llamada llega, aunque la aplicación no esté en primer plano.

image

Así de sencillo, podéis hacer una app que siga al dispositivo aun estando en background. Como siempre, aquí podéis descargar el código de ejemplo de la aplicación para que tengáis una guía de como hacer lo que os cuento. Por supuesto, con MVVM, IoC y servicios, “Rico, Rico” jeje.

Espero que este pequeño post os ayude.

Un saludo y Happy Coding!

4 comentarios sobre “[Windows Phone 8] Ejecución de código en segundo plano (I).”

Responder a jyeray Cancelar respuesta

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