Desencadenar una tarea en segundo plano desde dentro de la aplicación

Aprende a usar ApplicationTrigger para activar una tarea en segundo plano desde dentro de la aplicación.

Para obtener un ejemplo de cómo crear un desencadenador de aplicación, consulte este ejemplo.

En este tema se supone que tiene una tarea en segundo plano que desea activar desde la aplicación. Si aún no tiene una tarea en segundo plano, hay una tarea en segundo plano de ejemplo en BackgroundActivity.cs. O bien, siga los pasos descritos en Creación y registro de una tarea en segundo plano fuera de proceso para crear una.

Por qué usar un desencadenador de aplicación

Use applicationTrigger para ejecutar código en un proceso independiente de la aplicación en primer plano. ApplicationTrigger es adecuado si la aplicación tiene trabajo que debe realizarse en segundo plano, incluso si el usuario cierra la aplicación en primer plano. Si el trabajo en segundo plano debe detenerse cuando se cierra la aplicación o debe estar vinculado al estado del proceso en primer plano, se debe usar la ejecución extendida , en su lugar.

Creación de un desencadenador de aplicación

Cree un nuevo ApplicationTrigger. Puede almacenarlo en un campo como se hace en el fragmento de código siguiente. Esto es por comodidad para que no tengamos que crear una nueva instancia más adelante cuando queremos señalar el desencadenador. Pero puede usar cualquier instancia de ApplicationTrigger para indicar el desencadenador.

// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
_AppTrigger = new ApplicationTrigger();
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
Windows::ApplicationModel::Background::ApplicationTrigger _AppTrigger;
// _AppTrigger is an ApplicationTrigger field defined at a scope that will keep it alive
// as long as you need to trigger the background task.
// Or, you could create a new ApplicationTrigger instance and use that when you want to
// trigger the background task.
ApplicationTrigger ^ _AppTrigger = ref new ApplicationTrigger();

(Opcional) Agregar una condición

Puede crear una condición de tarea en segundo plano para controlar cuándo se ejecuta la tarea. Una condición impide que la tarea en segundo plano se ejecute hasta que se cumpla la condición. Para obtener más información, vea Establecer condiciones para ejecutar una tarea en segundo plano.

En este ejemplo, la condición se establece en InternetAvailable para que, una vez desencadenada, la tarea solo se ejecute una vez que esté disponible el acceso a Internet. Para obtener una lista de posibles condiciones, consulta SystemConditionType.

SystemCondition internetCondition = new SystemCondition(SystemConditionType.InternetAvailable);
Windows::ApplicationModel::Background::SystemCondition internetCondition{
    Windows::ApplicationModel::Background::SystemConditionType::InternetAvailable };
SystemCondition ^ internetCondition = ref new SystemCondition(SystemConditionType::InternetAvailable)

Para obtener más información detallada sobre las condiciones y los tipos de desencadenadores en segundo plano, consulta Compatibilidad de la aplicación con tareas en segundo plano.

Llamar a RequestAccessAsync()

Antes de registrar la tarea en segundo plano ApplicationTrigger , llame a RequestAccessAsync para determinar el nivel de actividad en segundo plano que el usuario permite porque es posible que el usuario haya deshabilitado la actividad en segundo plano de la aplicación. Consulte Optimización de la actividad en segundo plano para obtener más información sobre las formas en que los usuarios pueden controlar la configuración de la actividad en segundo plano.

var requestStatus = await Windows.ApplicationModel.Background.BackgroundExecutionManager.RequestAccessAsync();
if (requestStatus != BackgroundAccessStatus.AlwaysAllowed)
{
   // Depending on the value of requestStatus, provide an appropriate response
   // such as notifying the user which functionality won't work as expected
}

Registrar la tarea en segundo plano

Registra la tarea en segundo plano llamando a tu función de registro de tareas en segundo plano. Para obtener más información sobre cómo registrar tareas en segundo plano y ver la definición del método RegisterBackgroundTask() en el código de ejemplo siguiente, vea Registrar una tarea en segundo plano.

Si está pensando en usar un desencadenador de aplicación para ampliar la duración del proceso en primer plano, considere la posibilidad de usar la ejecución extendida en su lugar. El desencadenador de aplicación está diseñado para crear un proceso hospedado por separado en el que realizar el trabajo. El siguiente fragmento de código registra un desencadenador en segundo plano fuera de proceso.

string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Example application trigger";

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);
std::wstring entryPoint{ L"Tasks.ExampleBackgroundTaskClass" };
std::wstring taskName{ L"Example application trigger" };

Windows::ApplicationModel::Background::BackgroundTaskRegistration task{
    RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition) };
String ^ entryPoint = "Tasks.ExampleBackgroundTaskClass";
String ^ taskName   = "Example application trigger";

BackgroundTaskRegistration ^ task = RegisterBackgroundTask(entryPoint, taskName, appTrigger, internetCondition);

Los parámetros de registro de tareas en segundo plano se validan en el momento en que se realiza el registro. Se devuelve un error si cualquiera de los parámetros de registro no es válido. Asegúrate de que la aplicación se ocupe correctamente de los escenarios en los que se produce un error en el registro de tareas en segundo plano. Si, en cambio, la aplicación depende de que haya un objeto de registro válido después de intentar registrar una tarea, es posible que se bloquee.

Desencadenar la tarea en segundo plano

Antes de desencadenar la tarea en segundo plano, use BackgroundTaskRegistration para comprobar que la tarea en segundo plano está registrada. Un buen momento para comprobar que todas las tareas en segundo plano están registradas durante el inicio de la aplicación.

Desencadene la tarea en segundo plano llamando a ApplicationTrigger.RequestAsync. Cualquier instancia de ApplicationTrigger lo hará.

Tenga en cuenta que no se puede llamar a ApplicationTrigger.RequestAsync desde la propia tarea en segundo plano o cuando la aplicación está en estado de ejecución en segundo plano (consulte Ciclo de vida de la aplicación para obtener más información sobre los estados de la aplicación). Puede devolver DisabledByPolicy si el usuario ha establecido directivas de energía o privacidad que impiden que la aplicación realice actividades en segundo plano. Además, solo se puede ejecutar una instancia de AppTrigger a la vez. Si intenta ejecutar un AppTrigger mientras ya se está ejecutando otro, la función devolverá CurrentlyRunning.

var result = await _AppTrigger.RequestAsync();

Administración de recursos para la tarea en segundo plano

Usa BackgroundExecutionManager.RequestAccessAsync para determinar si el usuario ha decidido que la actividad en segundo plano de la aplicación debe ser limitada. Ten en cuenta el uso de la batería y ejecuta aplicaciones en segundo plano solo cuando sea necesario completar una acción que requiera el usuario. Consulte Optimización de la actividad en segundo plano para obtener más información sobre las formas en que los usuarios pueden controlar la configuración de la actividad en segundo plano.

  • Memoria: optimizar la memoria y el uso de energía de la aplicación es clave para asegurarse de que el sistema operativo permitirá que se ejecute la tarea en segundo plano. Use las API de administración de memoria para ver la cantidad de memoria que usa la tarea en segundo plano. Cuanto más memoria use la tarea en segundo plano, más difícil es que el sistema operativo lo mantenga en ejecución cuando otra aplicación está en primer plano. El usuario es, en última instancia, quien controla toda la actividad en segundo plano que la aplicación puede llevar a cabo y quien tiene visibilidad sobre el impacto que la aplicación tiene sobre el uso de la batería.
  • Tiempo de CPU: las tareas en segundo plano están limitadas por la cantidad de tiempo de uso del reloj que obtienen en función del tipo de desencadenador. Las tareas en segundo plano desencadenadas por el desencadenador de aplicación se limitan a unos 10 minutos.

Consulta Dar soporte a tu aplicación mediante tareas en segundo plano para conocer las restricciones de recursos que se aplican a las tareas en segundo plano.

Comentarios

A partir de Windows 10, ya no es necesario que el usuario agregue la aplicación a la pantalla de bloqueo para poder usar tareas en segundo plano.

Una tarea en segundo plano solo se ejecutará con applicationTrigger si primero ha llamado a RequestAccessAsync .