Detectando a reboot programaticamente no Windows Phone 8.1

Eu tenho um WP 8.1 Runtime que lança uma tarefa em segundo plano DeviceUseTrigger . O problema é que sempre que o telefone é reinicializado, essa tarefa obviamente cancela, mas o registro da tarefa permanece em vigor. Então, quando eu lanço meu aplicativo na próxima vez que a tarefa em segundo plano parece estar em execução quando na realidade não é. Eu quero alguma maneira de detectar sempre que o telefone for reinicializado e / ou detectar, de alguma forma, se a tarefa está realmente em execução ou não. O código que estou usando para verificar o registro da tarefa em segundo plano é o seguinte:

 foreach(IBackgroundTaskRegistration task in BackgroundTaskRegistration.AllTasks.Values) { if ((task as BackgroundTaskRegistration).Name == myTaskName) { Debug.WriteLine("Task is already running"); } } 

Consegui resolver o problema de uma maneira quase que embaraçosamente simples. A tarefa em segundo plano é cancelada quando o telefone está sendo desligado, por isso, anexei um manipulador de events ao evento taskInstane.Canceled em minha tarefa em segundo plano e adicionei duas linhas a ele:

 StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync("TaskCancelling.txt" CreateCollisionOption.OpenIfExists); deferral.Complete(); 

Em seguida, no aplicativo em primeiro plano, o código a seguir é executado sempre que o aplicativo é iniciado:

 foreach(IBackgroundTaskRegistration task in BackgroundTaskRegistration.AllTasks.Values) { if ((task as BackgroundTaskRegistration).Name == myTaskName) { if (await IsFilePresentInLocalDirectory("TaskCancelling.txt")) { //Task registration is present, but task isn't actually running. //Unregister the useless task (task as BackgroundTaskRegistration).Unregister(true); //Delete the file StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync("TaskCancelling.txt"); await file.DeleteAsync(); //Relaunch the DeviceUseTrigger task RelaunchBackgroundTask(); } } } private async Task IsFilePresentInLocalDirectory(string fileName) { try { StorageFile file = await ApplicationData.Current.LocalFolder.GetFileAsync(fileName); return true; } catch (Exception exc) { return false; } } 

Bastante auto-explicativo, acabei de criar um arquivo de texto vazio para criar uma espécie de log de cancelamento de tarefas e cada vez que meu aplicativo é iniciado, eu verifico para ver se o arquivo está presente. Se estiver, a tarefa será reiniciada e o arquivo será excluído.

    Intereting Posts