2017-09-28 10 views
0

Je crée un service d'application UWP en cours de traitement et un autre programme client (de bureau) qui communique avec l'application via le service d'application. Le programme client veut savoir si l'application UWP est en cours d'exécution (au premier plan), fonctionnait déjà en arrière-plan avant l'application de bureau a ouvert le AppServiceConnection, a été suspendu ou ne fonctionnait pas du tout. En d'autres termes, l'application doit être en mesure de transmettre, via le service de l'application, où il était dans son lifecycle.Récupère le cycle de vie de l'application UWP

Existe-t-il un moyen de détecter par programme l'état du cycle de vie d'une application, autre que l'implémentation de ma propre variable d'état que je mets à jour lorsque l'un des événements pertinents est déclenché? Il semble que cela devrait être possible, mais je ne trouve pas d'API pour cela. Évidemment, il ne vous dira jamais que vous êtes actuellement suspendu ou pas, mais être capable de faire la différence entre "suspendu sauf pour cette tâche de service d'application" et "s'exécuter activement au premier plan" serait utile.

Répondre

0

Le programme client veut savoir si l'application UWP est actuellement en cours d'exécution (au premier plan), était déjà en cours d'exécution en arrière-plan avant l'application de bureau a ouvert la AppServiceConnection

Avant l'application de bureau a ouvert la AppServiceConnection connexion, le client ne devrait pas être en mesure de communiquer avec le fournisseur de services de l'application, car l'application UWP est sandbox. Obtenir l'état actuel du fournisseur de services de l'application à l'intérieur de celui-ci n'a aucune utilité pour l'application cliente. Si l'application de bureau client est .NET Framework, vous pouvez essayer d'utiliser la propriété Process.Responding pour obtenir l'état du processus du fournisseur de services. Par exemple, si Process.Responding est vrai alors le fournisseur de service est "en cours d'exécution au premier plan", s'il est faux, le fournisseur devrait être suspendu, si juste ne peut pas trouver le processus fournisseur, il devrait être terminé.

static void Main(string[] args) 
{ 
    Process[] processes = Process.GetProcesses(); 

    foreach (Process process in processes) 
    { 
     if (process.ProcessName == "AppServicesProvider") 
      Console.WriteLine("Process Name: {0}, Responding: {1}", process.ProcessName, process.Responding); 
    } 
    Console.ReadLine(); 
} 

En d'autres termes, l'application doit être en mesure de transmettre, par le service d'application, où il était dans son cycle de vie.

Si vous voulez dire que le service de l'application, la façon dont vous avez mentionné ce magasin un état à l'intérieur du app data lorsque l'état d'exécution de l'application est le changement devrait bien fonctionner. Il semble que vous ne souhaitiez pas l'utiliser, mais en réalité, l'état correspondant au handle d'événement déclenché indique que l'état d'exécution de l'application est modifié.

private async void App_Suspending(object sender, SuspendingEventArgs e) 
{ 
    SuspendingDeferral deferral = e.SuspendingOperation.GetDeferral(); 
    Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; 
    localSettings.Values["currentlife"] = "Suspended"; 
    deferral.Complete(); 
} 
private async void OnAppServiceRequestReceived(AppServiceConnection sender, AppServiceRequestReceivedEventArgs args) 
{ 
    var messageDeferral = args.GetDeferral(); 
    Windows.Storage.ApplicationDataContainer localSettings =Windows.Storage.ApplicationData.Current.LocalSettings; 
    Object value = localSettings.Values["currentlife"]; 
    try 
    { 
     var input = args.Request.Message; 
     //Create the response 
     var result = new ValueSet(); 
     result.Add("result", value); 
     //Send the response 
     await args.Request.SendResponseAsync(result); 
    } 
    finally 
    { 
     //Complete the message deferral so the platform knows we're done responding 
     messageDeferral.Complete(); 
    } 
} 
+0

L'application de bureau en question est un processus en arrière-plan qui est inclus dans le regroupement d'applications UWP via un pont de bureau. Il s'agit d'un processus de longue durée qui peut à la fois démarrer avant que l'application ne le fasse (via le lancement à Windows-login) et persister après la fermeture de l'application. Certains des messages que l'application de bureau peut envoyer à l'application UWP n'ont de sens que si l'application UWP est déjà en cours d'exécution, et non si elle est suspendue ou n'a pas encore été lancée. – CBHacking