使用 ToastNotificationActionTrigger 从后台任务中检索 toast 参数
Retrieve toast arguments from within a background task using ToastNotificationActionTrigger
我正在尝试从后台任务中的 toast 通知中检索参数,但是 Microsoft 网站上推荐的方法不起作用。
我在我的主要 UWP 应用程序的 OnInitialize() 方法中如下注册任务:
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"
};
我发送给设备的toast通知如下:
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>";
后台任务(在单独的windows运行时组件项目中)如下:
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();
}
}
包清单还注册了如下后台任务:
<Extension Category="windows.backgroundTasks" EntryPoint="AppNamespace.GetQuestionsBackground">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
details 变量只是空的,但是 if 语句条件为真?
此外,当我在代码中断点并单步执行它时,visual studio 无法查看 taskInstance.triggerDetails 的当前状态...
任何帮助将不胜感激,谢谢!
更新:
我在点击toast通知按钮查看Visual Studio里面的变量的时候已经断点进入了后台任务,在m_argument[=32=下面可以看到我想要的数据] 本机实现上 _PiEventDetails 中的变量。
所以我知道数据在那里,但 getter 似乎不起作用。
事实证明,我实际上是在尝试这样做:
var arguments = details.argument;
arguments.split(':');
而不是尝试直接访问 details.argument,这显然是无效的。
感谢@jay-zuo-msft 帮助我实现这一点。
我正在尝试从后台任务中的 toast 通知中检索参数,但是 Microsoft 网站上推荐的方法不起作用。
我在我的主要 UWP 应用程序的 OnInitialize() 方法中如下注册任务:
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"
};
我发送给设备的toast通知如下:
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>";
后台任务(在单独的windows运行时组件项目中)如下:
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();
}
}
包清单还注册了如下后台任务:
<Extension Category="windows.backgroundTasks" EntryPoint="AppNamespace.GetQuestionsBackground">
<BackgroundTasks>
<Task Type="systemEvent" />
</BackgroundTasks>
</Extension>
details 变量只是空的,但是 if 语句条件为真? 此外,当我在代码中断点并单步执行它时,visual studio 无法查看 taskInstance.triggerDetails 的当前状态...
任何帮助将不胜感激,谢谢!
更新: 我在点击toast通知按钮查看Visual Studio里面的变量的时候已经断点进入了后台任务,在m_argument[=32=下面可以看到我想要的数据] 本机实现上 _PiEventDetails 中的变量。 所以我知道数据在那里,但 getter 似乎不起作用。
事实证明,我实际上是在尝试这样做:
var arguments = details.argument;
arguments.split(':');
而不是尝试直接访问 details.argument,这显然是无效的。
感谢@jay-zuo-msft 帮助我实现这一点。