如何在前台App中抑制推送吐司通知?

时间:2015-02-23 15:04:04

标签: c# windows-runtime windows-phone-8.1

注意:我只使用模拟器对其进行了测试,并使用内置功能推送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内,因为我在此应用程序中有许多页面,但无论用户在哪个页面上,并且没有将用户重定向到其他页面,都需要显示此内容对话框。但是,我当然愿意接受新的建议。

1 个答案:

答案 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。