Windows Phone 警报器不断自动重新开启

Posted

技术标签:

【中文标题】Windows Phone 警报器不断自动重新开启【英文标题】:Windows Phone alarm constantly turning itself back on 【发布时间】:2014-04-22 03:30:12 【问题描述】:

我正在尝试为 Windows Phone 编写一个闹钟应用程序,该应用程序要求用户在闹钟响起时解决数学问题。现在我被卡住了,我的 MainPage 包含打开警报的设置,当警报响起时,用户被重定向到另一个 xaml 页面,该页面要求用户输入随机生成的数学答案问题以关闭警报。我的问题是,一旦用户解决问题并点击复选框,应用程序应该首先将 alarmSet 值设置为 false,并将用户重定向回主页面:

private void Solve_Click(object sender, EventArgs e)
    

        this.userSolve = Convert.ToInt32(answerInput.Text);
        if (userSolve != answer)
        
            MessageBox.Show("Incorrect");
            //userAnswerInt = Convert.ToInt32(answerInput.Text);


        

        else if (userSolve == answer)
        
            MainPage.alarmSet.Value = false;
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        


    

然后当用户到达主页面时,OnLoaded 方法应该停止警报声并将一切恢复正常:

public async void OnLoaded(object sender, EventArgs e)
    

        this.timer.Stop();
        this.alarmSound.Stop();


        alarmSet.Value = false;
        this.notificationSwitch.IsChecked = alarmSet.Value;

        this.timePicker.Value = new DateTime(1, 1, 1,
                                             alarmTime.Value.Hours,
                                             alarmTime.Value.Minutes,
                                             0
                                             );



        if (alarmSet.Value == true)
            this.alarmTimeText.Text = alarmTimeString;
        else if (alarmSet.Value == false)
            this.alarmTimeText.Text = "alarm off";

但问题是,每次用户解决数学问题时,他们都会被带回主页并立即重定向回闹钟响铃页面,因为闹钟仍然处于打开状态。这会创建一个无限循环的警报相互重叠,我无法弄清楚为什么,即使我在导航回主页之前将 alarmSet.Value 设置为 false,警报仍然被视为开启......有什么我还需要做什么?如何在不立即响起的情况下开启闹钟并将时钟设置为当前分钟?

【问题讨论】:

【参考方案1】:

我在 Windows Phone 的应用程序生命周期中没有看到“OnLoaded”事件。

参考:http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff817008(v=vs.105).aspx

您可以执行以下操作:

    在 Mainpage.xaml 中,查看警报是否正在运行,如果 alarmSet 为 true,则将用户重定向到 onNavigatedTo 事件下的下一页。

    在下一页中,将 alarmSet 设置为 false 并将用户重定向到 MainPage.xaml。 onNavigatedTo 将再次被触发,但是,由于 alarmSet 为 false,用户不会被重定向到任何地方。您可以在此处执行停止警报或其他任何操作的 else 情况。

【讨论】:

感谢您的回复,我将此应用程序基于 Windows Phone 代码示例页面中的“带有语音命令的闹钟”示例。 OnLoaded 事件已存在于代码中。起初,我将所有代码都放在 OnNavigatedTo 事件中,但在调试之后,似乎在重定向回主页时,运行的是 OnLoaded 事件而不是 OnNavigatedTo 事件。在导航回主页之前,我已经将 alarmSet.Value 设置为 false,并且由于某种原因,警报仍被视为“开启”并且基本上重新触发了警报。 因此,由于某种原因,一旦用户解决了问题,似乎在从警报响铃页面导航回到主页时,主页被完全重绘,重新创建一切,就好像程序正在启动一样第一次,而不仅仅是把它带回前台。如何导航到新页面并保持主页在后台运行? 参考code.msdn.microsoft.com/wpapps/Alarm-Clock-with-voice-7b749124/… 的示例,onLoaded 事件仅在应用首次启动时调用。见:// Register the voice commands. Called when the app is first launched. public async void OnLoaded(object sender, EventArgs e) 它似乎应该这样做,但是例如,我在加载的代码中添加了将我的时间选择器值设置为当前时间加一小时,并且每次我点击时间选择器更改时间,无论我输入什么值加上一小时,它都会带我回到主页。 onloaded 每次都会运行,如果我只是丢弃整个 onloaded 方法,我会好吗?我假设这条线将加载时发生的任何事情路由到 onloaded 方法' this.onLoadedEventHandler = new RoutedEventHandler(OnLoaded); this.Loaded += onLoadedEventHandler;' 所以如果我删除了 onloaded 方法,应用程序会默认使用 onNavigatedTo 代替吗?

以上是关于Windows Phone 警报器不断自动重新开启的主要内容,如果未能解决你的问题,请参考以下文章

Windows Phone 在特定工作日重复警报

Windows Phone:警报类未按预期触发

Windows Phone:是不是可以混合 toast 通知和预定警报?

在 Windows phone 8.1 中实时跟踪位置

ibm mobilefirst for windows phone 8中的registerEventSourceCallback函数问题

重新启动 Pod 时发出警报:Windows 容器上的 Prometheus