Tutorial del ciclo de vida de las aplicaciones Xamarin.Forms
Antes de intentar este tutorial, debe haber completado correctamente lo siguiente:
- Inicio rápido Compilación de la primera aplicación de Xamarin.Forms.
- Tutorial sobre el diseño de pila (StackLayout).
- Tutorial sobre las entradas (Entry).
En este tutorial, aprenderá a:
- Responder a una aplicación que se inicia, está en modo de suspensión o se reanuda.
- Conservar datos entre los cambios de estado del ciclo de vida.
Va a usar Visual Studio 2019, o Visual Studio para Mac, para crear una aplicación sencilla que demuestre cómo conservar los datos entre los cambios de estado del ciclo de vida. En las capturas de pantalla siguientes se muestra la aplicación final:
Respuesta a los cambios de estado del ciclo de vida
Para completar este tutorial debe tener Visual Studio 2019 (versión más reciente), con la carga de trabajo Desarrollo para dispositivos móviles con .NET instalada. Además, necesita un equipo Mac emparejado para compilar la aplicación del tutorial en iOS. Para obtener información sobre la instalación de la plataforma de Xamarin, consulte Instalación de Xamarin. Para obtener información sobre cómo conectar Visual Studio 2019 a un host de compilación de Mac, consulte Emparejar con Mac para el desarrollo de Xamarin.iOS.
Inicie Visual Studio y cree una aplicación de Xamarin.Forms en blanco llamada AppLifecycleTutorial.
Importante
Los fragmentos de código de C# y XAML en este tutorial necesitan que la solución se denomine AppLifecycleTutorial. El uso de otro nombre dará como resultado errores de compilación al copiar el código de este tutorial en la solución.
Para obtener más información sobre la biblioteca de .NET Standard creada, vea Anatomía de una aplicación de Xamarin.Forms en Análisis detallado de inicio rápido de Xamarin.Forms.
En el Explorador de soluciones, en el proyecto AppLifecycleTutorial, expanda App.xaml y haga doble clic en App.xaml.cs para abrirlo. Después, en App.xaml.cs, actualice los reemplazos
OnStart
,OnSleep
yOnResume
, como se indica a continuación:protected override void OnStart() { Console.WriteLine("OnStart"); } protected override void OnSleep() { Console.WriteLine("OnSleep"); } protected override void OnResume() { Console.WriteLine("OnResume"); }
Este código actualiza los reemplazos del método de ciclo de vida de las aplicaciones con instrucciones
Console.WriteLine
que indican cuándo se ha invocado cada método:- El método
OnStart
se invoca cuando se inicia la aplicación. - El método
OnSleep
se invoca cuando la aplicación pasa a segundo plano. - El método
OnResume
se invoca cuando la aplicación se reanuda desde segundo plano.
Nota
No hay ningún método para la finalización de aplicaciones. En circunstancias normales, la finalización de aplicaciones se produce desde el método
OnSleep
.- El método
En la barra de herramientas de Visual Studio, pulse el botón Iniciar (el botón triangular similar a un botón de reproducción) para iniciar la aplicación en Android Emulator o en el simulador remoto de iOS elegido. Cuando se inicia la aplicación, se invoca el método
OnStart
y se genera OnStart en la ventana Salida de la aplicación de Visual Studio:[Mono] Found as 'java_interop_jnienv_get_object_array_element'. OnStart [OpenGLRenderer] HWUI GL Pipeline
Cuando la aplicación pasa a segundo plano (al pulsar el botón Inicio en iOS o Android), se invoca el método
OnSleep
:[EGL_emulation] eglMakeCurrent: 0x83ee2920: ver 3 0 (tinfo 0x8357eff0) OnSleep [Mono] Image addref System.Runtime.Serialization[0x83ee19c0] -> System.Runtime.Serialization.dll[0x83f57b00]: 2
Después, cuando la aplicación se reanuda desde segundo plano (pulse el icono de aplicación en iOS; pulse el botón "Información general" en Android y seleccione la aplicación AppLifecycleTutorial), se invoca el método
OnResume
:Thread finished: <Thread Pool> #5 OnResume [EGL_emulation] eglMakeCurrent: 0x83ee2920: ver 3 0 (tinfo 0x8357eff0)
Nota:
En estos bloques de código, se muestra un resultado de ejemplo al ejecutar la aplicación en Android.
En Visual Studio, detenga la aplicación.
Para obtener más información sobre el ciclo de vida de la aplicación de Xamarin.Forms, consulte Ciclo de vida de la aplicación de Xamarin.Forms.
Conservación de los datos entre los cambios de estado del ciclo de vida
La subclase Application
tiene un diccionario Properties
estático que se puede usar para almacenar datos a lo largo de los cambios de estado del ciclo de vida. Este diccionario usa una clave string
y almacena un valor object
. El diccionario se guarda automáticamente en el dispositivo y se vuelve a rellenar cuando se reinicia la aplicación.
Importante
El diccionario Properties
solo puede serializar tipos primitivos para el almacenamiento.
En este ejercicio, modificará la aplicación para conservar el texto de un objeto Entry
tras el procesamiento en segundo plano y restaurar el texto al objeto Entry
cuando se reinicie la aplicación.
En el Explorador de soluciones, en el proyecto AppLifecycleTutorial, expanda App.xaml y haga doble clic en App.xaml.cs para abrirlo. Después, en App.xaml.cs, quite todo el código de plantilla y sustitúyalo por el código siguiente:
using System; using Xamarin.Forms; namespace AppLifecycleTutorial { public partial class App : Application { const string displayText = "displayText"; public string DisplayText { get; set; } public App() { InitializeComponent(); MainPage = new MainPage(); } protected override void OnStart() { Console.WriteLine("OnStart"); if (Properties.ContainsKey(displayText)) { DisplayText = (string)Properties[displayText]; } } protected override void OnSleep() { Console.WriteLine("OnSleep"); Properties[displayText] = DisplayText; } protected override void OnResume() { Console.WriteLine("OnResume"); } } }
Este código define una propiedad
DisplayText
y una constantedisplayText
. Cuando la aplicación se pasa a segundo plano o se termina, la invalidación del métodoOnSleep
agrega el valor de propiedadDisplayText
al diccionarioProperties
con una clave dedisplayText
. Después, cuando se inicia la aplicación, siempre y cuando el diccionarioProperties
contenga la clavedisplayText
, el valor de la clave se restaura a la propiedadDisplayText
.Importante
Para evitar errores inesperados, compruebe que el diccionario
Properties
tenga la clave antes de obtener acceso.No es necesario restaurar datos del diccionario
Properties
en la sobrecarga del métodoOnResume
. Esto se debe a que, cuando una aplicación pasa a segundo plano, dicha aplicación y su estado todavía están en la memoria.En el Explorador de soluciones, en el proyecto AppLifecycleTutorial, haga doble clic en MainPage.xaml para abrirlo. Después, en MainPage.xaml, quite todo el código de plantilla y sustitúyalo por el código siguiente:
<?xml version="1.0" encoding="utf-8"?> <ContentPage xmlns="http://xamarin.com/schemas/2014/forms" xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" x:Class="AppLifecycleTutorial.MainPage"> <StackLayout Margin="20,35,20,20"> <Entry x:Name="entry" Placeholder="Enter text here" Completed="OnEntryCompleted" /> </StackLayout> </ContentPage>
Este código define mediante declaración la interfaz de usuario de la página, que consiste en un objeto
Entry
en unStackLayout
. La propiedadEntry.Placeholder
especifica el texto de marcador de posición que se muestra cuando el objetoEntry
aparece por primera vez, y se registra un controlador de eventos denominadoOnEntryCompleted
con el eventoCompleted
. Además, el objetoEntry
tiene un nombre que se especifica con el atributox:Name
. Esto permite al archivo de código subyacente tener acceso al objetoEntry
con el nombre que se le ha asignado.En el Explorador de soluciones, en el proyecto AppLifecycleTutorial, expanda MainPage.xaml y haga doble clic en MainPage.xaml.cs para abrirlo. Después, en MainPage.xaml.cs, agregue una invalidación del método
OnAppearing
y el controlador de eventosOnEntryCompleted
a la clase:protected override void OnAppearing() { base.OnAppearing(); entry.Text = (Application.Current as App).DisplayText; } void OnEntryCompleted(object sender, EventArgs e) { (Application.Current as App).DisplayText = entry.Text; }
El método
OnAppearing
recupera el valor de la propiedadApp.DisplayText
y lo establece como valor de propiedadText
del objetoEntry
.Nota
La invalidación del método
OnAppearing
se ejecuta después de que se diseñeContentPage
, pero justo antes de que sea visible. Por lo tanto, se trata de un lugar adecuado para establecer el contenido de las vistas de Xamarin.Forms.Cuando se finaliza el texto en el objeto
Entry
, al pulsar la tecla ENTRAR, el métodoOnEntryCompleted
se ejecuta y el textoEntry
se almacena en la propiedadApp.DisplayText
.En la barra de herramientas de Visual Studio, pulse el botón Iniciar (el botón triangular similar a un botón de reproducción) para iniciar la aplicación en Android Emulator o en el simulador remoto de iOS elegido.
Escriba algo de texto en el objeto
Entry
y pulse la tecla ENTRAR. Después, ejecute en segundo plano la aplicación. Para ello, pulse el botón de inicio para invocar el métodoOnSleep
.En Visual Studio, detenga la aplicación y vuelva a iniciarla; entonces, se restaurará el texto que se haya especificado anteriormente en el objeto
Entry
:En Visual Studio, detenga la aplicación.
Para obtener más información sobre cómo conservar datos en el diccionario Properties, consulte Diccionario de propiedades en la guía Clase de aplicación de Xamarin.Forms.
¡Enhorabuena!
Ha completado el tutorial, donde ha aprendido a:
- Responder a una aplicación que se inicia, está en modo de suspensión o se reanuda.
- Conservar datos entre los cambios de estado del ciclo de vida.
Pasos siguientes
Para obtener más información sobre los conceptos básicos de creación de aplicaciones móviles con Xamarin.Forms, continúe al tutorial sobre la base de datos local.
Vínculos relacionados
¿Tiene algún problema con esta sección? Si es así, envíenos sus comentarios para que podamos mejorarla.