2016-05-24 7 views
2

Ich habe Schwierigkeiten, erweiterte Ausführung Sitzung für meine Windows Universal App zu arbeiten.Ich verstehe, erweiterte Ausführungssitzung in Windows Universal App (UWP)

Was ich versuche zu erreichen, ist das folgende Szenario. Der Benutzer möchte das Telefon über Bluetooth mit einem Gerät verbinden. Derzeit, wenn sich der Bildschirm ausschaltet oder ein eingehender Anruf eingeht oder der Benutzer die App minimiert, schlägt die Verbindung fehl und wir starten sie bei Fortsetzen neu. Ich möchte die erweiterte Ausführung für diese in Bearbeitung befindliche Verbindung aktivieren, sodass die App die Arbeit auch dann fortsetzt, wenn sie minimiert (ausgesetzt) ​​ist.

Ich habe festgestellt, ich brauche die ExtendedExecutionReason.Unspecified, wie es meiner App erlauben sollte, bis zu 10 Minuten im suspendierten Zustand zu laufen (was mehr als genug für meinen Zweck ist). Allerdings scheint die Verbindung beim Aussetzen immer zu scheitern (und ich werde mit ExtendedExecutionRevokedReason.SystemPolicy widerrufen, wenn ich versuche, den Status meiner App vom Debugger zu ändern, indem ich das Application Lifecycle-Dropdown von VS verwende). Ich habe alle Batterie- und Hintergrundberechtigungen für meine App aktiviert, aber immer noch nicht gut.

Mein Code ist in etwa wie folgt:

 ... (on begin connection) 
     ClearExtendedExcecution(); 

     DisplayRequest dr = new DisplayRequest(); 
     var newSession = new ExtendedExecutionSession 
     { 
      Reason = ExtendedExecutionReason.Unspecified, 
      Description = "Pair device" 
     }; 
     newSession.Revoked += SessionRevoked; 
     ExtendedExecutionResult result = await newSession.RequestExtensionAsync(); 

     dr.RequestActive(); 
     try 
     { 
      switch (result) 
      { 
       case ExtendedExecutionResult.Allowed: 
        m_extendedExecutionSession = newSession; 
        // DO WORK HERE 
        await ConnectDeviceAsync(token); 
        break; 
       default: 
       case ExtendedExecutionResult.Denied: 
        // fallback to request screen active if extended execution fails, but still do work 
        newSession.Dispose(); 
        await ConnectDeviceAsync(token); 
        break; 
      } 
     } 
     finally 
     { 
      dr.RequestRelease(); 
      ClearExtendedExcecution(); 
     } 
     ... 


    private async void SessionRevoked(object sender, ExtendedExecutionRevokedEventArgs args) 
    { 
     await CoreApplication.MainView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      switch (args.Reason) 
      { 
       case ExtendedExecutionRevokedReason.Resumed: 
        Logger.Debug("Extended execution revoked due to returning to foreground."); 
        break; 

       case ExtendedExecutionRevokedReason.SystemPolicy: 
        Logger.Debug("Extended execution revoked due to system policy."); 
        break; 
      } 
     }); 
    } 

    private void ClearExtendedExcecution() 
    { 
     if (m_extendedExecutionSession == null) 
     { 
      return; 
     } 

     m_extendedExecutionSession.Revoked -= SessionRevoked; 
     m_extendedExecutionSession.Dispose(); 
     m_extendedExecutionSession = null; 
    } 

Irgendwelche Tipps, was ich falsch mache, wie genau die erweiterte Ausführungs Session soll verwendet werden, oder, wie der Lebenszyklus der Anwendung zu debuggen (ohne sie Der Systemrichtlinien-Widerruf) würde sehr geschätzt werden. Vielen Dank!

+0

Bitte versuchen Sie die ExtendedExecutionReason.Unter ExtendedExecutionReason.SavingData zu ändern. –

Antwort

6

In diesem Fall "Suspend" Lebenszyklusereignis in VS simuliert die Aussetzung aufgrund geringer Ressourcen, deshalb erhalten Sie als Grund "SystemPolicy".

Wenn Sie Ihre Anwendung ohne angehängten Debugger ausführen, sie minimieren (Desktop) oder zu einer anderen Anwendung (Telefon) wechseln, wird die Ausführung fortgesetzt (!), Wenn Sie Ihre Anwendung fortsetzen, wird die Sitzung mit "Angenommen" Grund widerrufen und Sie müssen die Sitzung erneut starten, indem Sie die Methode RequestExtensionAsync() aufrufen.

Diese Technik stellt sicher, dass Ihre Ausführung so lange aktiv ist, wie Sie benötigen. Hier

+0

Ja, danke für die Erklärung. Das habe ich vor einiger Zeit selbst herausgefunden. Ich war verwirrt wegen der Ressourcen, die ich im Zusammenhang mit diesem Problem gefunden hatte. Die meisten der verwendeten Samples erweiterten die Ausführung, um den OnSuspended-Callback zu verlängern, sodass sie einige Zustände speichern konnten. Ich brauchte es tatsächlich, um Nachrichten über BLE auszutauschen. Am Ende habe ich Toasten und Loggen benutzt, um herauszufinden, was genau in diesem Zusammenhang passierte. Im Grunde müssen Sie bei Wiederaufnahme des Widerrufs eine neue Sitzung anfordern.Sie müssen auch vorsichtig sein, wie Sie alte Sitzungen entsorgen –

0

ist das Tutorial auf erweiterten Ausführung: https://docs.microsoft.com/en-us/windows/uwp/launch-resume/run-minimized-with-extended-execution

Hier ist der Satz von Proben für Extended Execution ist: https://github.com/Microsoft/Windows-universal-samples/tree/master/Samples/ExtendedExecution

Sie sind richtig, ist es am besten keine Angaben Erweiterte Ausführung oder Location-Tracking zu verwenden, während Ihre Anwendung befindet sich im Status "Ausgeführt" und nicht im Status "Aussetzen" Für Ihr spezifisches Szenario klingt es so, als würden Sie versuchen, die Kommunikation mit einem Bluetooth-Gerät über ein Windows Phone fortzusetzen. Je nachdem, ob das Bluetooth-Gerät BLE oder älter ist, sind GattCharacteristicNotificationTrigger oder RfCommConnectionTrigger möglicherweise bessere Optionen. Sie benötigen nicht, dass Ihre App ständig im Hintergrund ausgeführt wird, und wecken stattdessen Ihre App während der peripheren Kommunikation. Kirans Übersicht über die verschiedenen Arten von Bluetooth-Auslösern aus der letztjährigen Build-Konferenz ist informativ und hier verfügbar: https://channel9.msdn.com/Events/Build/2016/P460

Verwandte Themen