注意:我只使用模拟器对其进行了测试,并使用内置功能推送toast。我假设这不是模拟器问题。
我关注了this guide,以便在应用运行时拦截推送吐司通知。但是,我只想在应用程序位于前台时禁止Toast通知。当另一个应用程序在前台时,它仍应显示。所以我在App.xaml.cs
中编写了以下处理程序(并订阅了PushNotificationReceived事件):
private async void OnPushNotification(PushNotificationChannel sender, PushNotificationReceivedEventArgs e)
{
string msg = "";
if (e.NotificationType == PushNotificationType.Toast)
{
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if (Window.Current.Visible)
{
msg += " Toast canceled.";
e.ToastNotification.SuppressPopup = true;
}
});
if (true) // actually determines if it's a certain type of toast
{
await CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () =>
{
ConfirmationContentDialog confirmationDialog = new ConfirmationContentDialog();
confirmationDialog.SetMessage("Please confirm that you like turtles." + msg);
await confirmationDialog.ShowAsync();
});
}
}
}
所以这是有效的,从某种意义上说,当应用程序在接收推送通知时处于前台时,我只看到“toast cancelled”消息。当我在开始屏幕或其他地方时,我总是得到祝酒词。这很好。但是,当应用程序处于前台时,有时(通常在发送第二次推送之后)无论如何都会显示toast(即使“Toast cancelled”显示)。但有时却没有。这是相当不一致的。
这让我相信,由于等待,有时候吐司会在代码在UI线程上运行之前通过,以检查应用程序是否可见。但是,我不能从这里访问Window.Current.Visible而不使用调度程序。我甚至试过CoreApplication.MainView.CoreWindow.Visible
,但这给了我“为不同线程等编组的接口”异常。说到这一点,我不明白除了CoreApplication.MainView.CoreWindow.Dispatcher
之外哪个地方可以调用CoreApplication.MainView.CoreWindow.Visible
?这怎么可以工作。
无论如何,我该如何解决这个问题?我想将此保留在App.xaml.cs
内,因为我在此应用程序中有许多页面,但无论用户在哪个页面上,并且没有将用户重定向到其他页面,都需要显示此内容对话框。但是,我当然愿意接受新的建议。
答案 0 :(得分:0)
我根据Kai Brummund的建议修改了这个问题,在App类中使用了一个简单的布尔切换,并订阅了VisibilityChanged事件,如下所示:
private bool APP_VISIBLE = true;
protected override async void OnLaunched(LaunchActivatedEventArgs e)
{
// Stuff put here by Visual Studio
Window.Current.VisibilityChanged += OnVisibilityChanged;
Window.Current.Activate();
}
private void OnVisibilityChanged(object sender, VisibilityChangedEventArgs e)
{
if (e.Visible)
APP_VISIBLE = true;
else
APP_VISIBLE = false;
}
这样我就可以使用APP_VISIBLE
来抑制弹出窗口而不必使用调度程序,并立即抑制toast。