2016-07-21 35 views
2

Ich versuche, die Argumente aus einer Toastbenachrichtigung innerhalb einer Hintergrundaufgabe abzurufen, die empfohlene Methode auf der Microsoft Website funktioniert jedoch nicht.Abrufen von Toastargumenten aus einer Hintergrundaufgabe mithilfe von ToastNotificationActionTrigger

ich die Aufgabe, wie unten bin Registrierung wie unten im OnInitialize() -Methode meiner Haupt UWP Anwendung:

foreach (var task in BackgroundTaskRegistration.AllTasks) 
{ 
     if (task.Value.Name.Equals(taskName)) 
     { 
      task.Value.Unregister(true); 
     } 
} 

BackgroundAccessStatus status = await BackgroundExecutionManager.RequestAccessAsync(); 

BackgroundTaskBuilder builder = new BackgroundTaskBuilder() 
{ 
     Name = taskName, 
     TaskEntryPoint = "AppNamespace.GetQuestionsBackground" 
}; 

Der Toast Benachrichtigung, dass ich an das Gerät schicke sich wie folgt:

var toast = "<?xml version=\"1.0\" encoding=\"utf - 8\"?>" + 
      $"<toast launch=\"questionId:{question.ToString()}:{journal.Id.ToString()}:{staffId.ToString()}\">" + 
      "<visual><binding template=\"ToastImageAndText02\">" + 
      "<text id=\"1\">New Question</text>" + 
      "<text id=\"2\">There is a question waiting to be answered</text>" + 
      "<image id=\"1\" src=\"ms-appx:///Assets/DailyQuestion32.png\" />" + 
      "</binding></visual>" + 
      "<actions>" + 
      $"<action activationType=\"foreground\" content=\"Answer now\" arguments=\"now:{question.ToString()}:{journal.Id.ToString()}:{staffId.ToString()}\"/>" + 
      $"<action activationType=\"background\" content=\"Answer later\" arguments=\"later:{question.ToString()}:{journal.Id.ToString()}:{staffId.ToString()}\"/>" + 
      "</actions>" + 
      "</toast>"; 

Und die Hintergrundaufgabe (die in einem separaten, Fenster Laufzeitkomponente Projekt ist) ist wie folgt:

public sealed class GetQuestionsBackground : IBackgroundTask 
{ 
    public async void Run(IBackgroundTaskInstance taskInstance) 
    { 
     _deferal = taskInstance.GetDeferral(); 

     this.container = this.diBootStaraaper.BootStrap(applicationData); 

     var details = taskInstance.TriggerDetails as ToastNotificationActionTriggerDetail; 

     if (details.Argument != null) 
     { 
      var argList = details.Argument.Split(':'); 

      IDataProvider dataProvider = DependencyHelper.Resolve<IDataProvider>(); 
      await dataProvider.SaveQuestion(argList[1], argList[2], argList[3]); 
      dataProvider.SaveSettings(); 

     } 
     _deferal.Complete(); 
    } 
} 

manifest Das Paket hat auch registerd die Hintergrundaufgabe wie folgt:

<Extension Category="windows.backgroundTasks" EntryPoint="AppNamespace.GetQuestionsBackground"> 
     <BackgroundTasks> 
     <Task Type="systemEvent" /> 
     </BackgroundTasks> 
</Extension> 

Die Details Variable ist einfach leer howeverm die if-Anweisung Bedingung wahr ist? Darüber hinaus Visual Studio ist nicht in der Lage, den aktuellen Status der taskInstance.triggerDetails anzuzeigen, wenn ich in den Code einbrechen und durchlaufen ...

Jede Hilfe wäre dankbar, danke!

UPDATE: Ich habe in den Hintergrund Aufgabe breakpointed, wenn ich auf die Schaltfläche Toast Benachrichtigung klicken und die Variablen in Visual Studio gesehen, und ich kann die Daten Ich möchte unter dem m_argument Variable innerhalb der _PiEventDetails siehe die native Implementierung. Also ich weiß, die Daten sind da, aber der Getter scheint nicht zu funktionieren.

+0

Der Code, den Sie gepostet haben, scheint richtig zu sein. Der Code für die Registrierung der Hintergrundaufgabe ist jedoch nicht vollständig und die Vorlage in Ihrer Toast-Benachrichtigung wird nicht empfohlen. Wenn ich jedoch mit Ihrem Code getestet habe, funktioniert es. Könnten Sie bitte einen [mcve] teilen, der Ihr Problem reproduzieren kann? –

+0

@ JayZuo-MSFT das ist alles von meinem Code, der auf diese Aufgabe verweist, die einzige andere Sache, die ich erwähnen kann ist, dass ich ein Template 10 UWP-Projekt als Vorlage – sparksy64

+0

Da Sie das Datum in 'm_argument' Variable sehen können , sollten Sie in der Lage sein, Ihre Daten mit 'Details.Argument' zu erhalten. Ich würde vorschlagen, dass Sie nur 'Debug.WriteLine (details.Argument)' verwenden, um die Daten auszugeben, um zu sehen, ob Sie das richtige Datum bekommen können. Und wenn Sie Ihr Projekt debuggen, würde ich vorschlagen, dass Sie den Debug-Modus verwenden und den Debugger-Typ auf ** Nur verwaltet ** einstellen, wie [dies] (http://i.stack.imgur.com/gPznl.png). –

Antwort

0

So stellt sich heraus, dass ich in der Tat war versucht zu tun:

var arguments = details.argument; 
    arguments.split(':'); 

statt details.argument direkt zuzugreifen versuchen, und dies war offenbar ungültig.

Danke @ jay-zuo-msft für die Hilfe, mir dies zu realisieren.