热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

修炼九阴真经WindowsPhone开发(10):计划通知Reminder和Alarm及ScheduledActionService类总结...

上一节示例说明了Reminder的使用方法。事实上,自从WP7.1之后,windowsphone开放一些后台调用,包括音乐,

上一节示例说明了 Reminder 的使用方法。

 

事实上,

自从 WP7.1之后,windows phone 开放一些后台调用,包括音乐,闹钟,播放器等,我们在做windows phone开发时,有可能会调用后台, 恰好我们的软件工程中需要用到闹钟提醒功能,现在就把具体的细节一步一步告诉大家。

包括实现多项提醒,存储和显示等功能。

一、Reminder

Reminder是我们Microsoft Academic Search (MAS) 的Windows Phone 7的一个应用的模块,用来提醒用户会议中每个session的开始。用户可以设置reminder的开始时间,结束时间,reminder的消息以及铃声,同时用户也可以删除已经存在的reminder。我需要做的就是提供创建和删除reminder的API,已经管理现有的reminders。下面我就谈一谈我在实现过程中的方法,遇到的困难,教训以及解决方案。

为了让我们的Reminder能在设定的时间响铃,我们使用了Windows Phone SDK 7.1的新功能——Alarm。我首先参考了MSDN官方的代码示例,地址如下:

http://msdn.microsoft.com/en-us/library/hh202965(v=vs.92).aspx

二、 Alarm。

首先我们需要使用Windows Phone的scheduler的namespace,代码如下:

using Microsoft.Phone.Scheduler;

总结:

使用从 ScheduledNotification 继承的 Alarm 和 Reminder 类以及 ScheduledActionService 类创建向系统注册计划通知。警报和提醒计划在未来的指定时间启动并且可以配置为按定期计划启动。启动提醒时,会启动一个对话框,该对话框显示标题以及您应用程序指定的其他文本内容。如果用户点按提醒 UI,您的应用程序会启动并导航到您指定的页面。您可以使用查询字符串参数在启动时将信息传递到您的应用程序。启动警报时,始终显示标题“Alarm”以及您提供的其他文本内容。警报还允许您指定启动时播放的自定义声音文件。如果用户点按警报 UI,则用来创建警报的应用程序会启动,而且会显示初始应用程序页面。

 

Scheduled Notifications类别:

  它用于允许Application註册在前景画面中依照设定触发时间区段来弹出週期性或一次性的警告(alarm)或提醒(remember)的机制。

  这样的註册动作主要是让Application类似向WP7 OS排程了一个定期或一次性要触发的事件,如同Outlook中定义的约会或工作週期,等到时间到达或符合设定提醒的时间区段时,系统会自动弹出一个提醒(remember)或警告(alert)视窗通知用户。

  因此,接下来介绍这二种主要的类型:

  A. Alarm:

  

IC531090

 

  呈现的型式:

  ‧Application Name:为建立该Alarm的应用程式名称;

  ‧Alarm:为类型名称,是固定的;

  ‧Alarm Content:为实际建立Alarm时所指定的Content讯息;

  ‧snooze:点击后,将触发应用程式设定復发时间,等待重新復发Alarm;

  ‧dimiss:点击后,结束该Alarm;

  ‧Sound:指定需要的音效,呈现音效时将由音量小的声音慢慢变大起来。

  B. Reminder:

  

IC531091

 

  呈现的型式:

  ‧Application Name:为建立该Alarm的应用程式名称;

  ‧Reminder Tile:为应用程式建立Reminder时所指定的标题;

  ‧Alarm Content:为实际建立Reminder时所指定的Content讯息;

  ‧Snooze for:指定要延迟(贪睡)的时间长度;

  ‧snooze/dismiss:点击后,均会启动应用程式,或是应用程式指定的特定Page,并且转到特定Page时也可以使用QueryString夹带参数;

  ‧Sound:Reminder採用预设的音效进行播放;

  了解Alarm与Reminder二种类型之后,接下来针对如何使用这二者时几个需要了解的属性与类别加以说明:

  ‧ScheuldedNotifcation:

  针对该类别不管在使用Alarm与Reminder时均会使用的属性加以说明:

类别属性说明
ReminderNavigationUri设定/取得当Reminder执行时,用户点击snooze后前往应用程式指定的Navigation Uri。
ReminderTitle取得通知讯息的标题。
Alarm/ReminderContent设定/取得通知的文字内文。
Alarm/ReminderBeginTime设定/取得Action的排程启动时间。
Alarm/ReminderExpirationTime设定/取得Action的排程到期时间。
Alarm/ReminderRecurrenceType设定/取得通知的RecurrenceType类型。
AlarmSound设定/取得当Alarm执行要播放的声音档案。
Alarm/ReminderIsScheduled取得Action的排程状态。
Alarm/ReminderName取得Action的排程名称。

 

  ‧RecurrenceInterval Enumeration:

  指定ScheduledNotofication物件到期后,復发时间类型的列举值。出现于ScheduledNotification类别的RecurrenceType属性,復发的时间与BeginTime属性会互相影响。常用于指定Alarm类型,当用户指定Alarm物件时,透过指定该值让用户点击snooze后,Alarm可以在指定的列举时间抵达时进行復发。其列举值如下:

列举值说明
None不復发。Notificatin只依据BeginTime属性设定的时间,发生一次即结束。
Daily每一天復发。
Weekly每一週復发。
Monthly每一个月復发。
EndOfMonth每一个月的月底復发。
Yearly每一年復发。

 

  以上说明了Scheduled Notification的一些重要属性与元素,接下来将简单举个例子加以说明如何使用Scheduled Notification。

  〉範例说明:

  a. 建立Alarm:

1: private void btnAddAlarm_Click(object sender, RoutedEventArgs e)

2: {

3: string tName = Guid.NewGuid().ToString();

4: DateTime tBgein = DateTime.Parse("2011/11/30 01:50");

5: DateTime tExpiration = DateTime.Parse("2011/11/30 03:00");

6: //建立Alarm物件

7: Alarm tAlarm = new Alarm(tName);

8: tAlarm.Content = "Show My Alarm content!!";

9: //tAlarm.Sound = new Uri("/Resources/Ring01.wma", UriKind.Relative);

10: tAlarm.BeginTime = tBgein;

11: tAlarm.ExpirationTime = tExpiration;

12: tAlarm.RecurrenceType = RecurrenceInterval.Daily;

13: //建立Alarm

14: ScheduledActionService.Add(tAlarm);

15: }

  b. 建立Reminder:

1: private void btnAddReminder_Click(object sender, RoutedEventArgs e)

2: {

3: string tName = Guid.NewGuid().ToString();

4: DateTime tBgein = DateTime.Parse("2011/11/30 01:54");

5: DateTime tExpiration = DateTime.Parse("2011/11/30 03:00");

6: //建立Reminder物件

7: Reminder reminder = new Reminder(tName);

8: reminder.Title = "Reminder custom title";

9: reminder.Content = "Remind to call me!!";

10: reminder.BeginTime = tBgein;

11: reminder.ExpirationTime = tExpiration;

12: reminder.RecurrenceType = RecurrenceInterval.Daily;

13: reminder.NavigationUri = new Uri("/MainPage.xaml?key="+ tName, UriKind.Relative);

14: 

15: ScheduledActionService.Add(reminder);

16: }

  这二个Scheduled Notification类型很常出现像是行事历元件用于建立固定时间提示用户相关的讯息,或是闹鐘等程式,让用户知道得到当下可能忘记的资讯。我觉得蛮容易使用的,只需要懂得二种类型的差异,即可以做出很棒的效果。

 

 

注意:

1. 重复的Reminder

用户在设置同一个session的reminder的时候,可能会修改设置,但是在我的程序里就会导致设置两个alarms,于是调用者对于同一个session必须先delete这个alarm(用之前create alarm返回的ID),然后才能创建新的。

2. 删去过期的Reminder

有些Alarms已经过了stopTime了,系统需要定期删掉这些Alarms。我是在每次创建新的alarm之前清理过期的alarms。

 

以下是要注意的代码片断:

 

public void setAlarm()
{
       
if (ScheduledActionService.Find("My Alarm") != null)
              ScheduledActionService.Remove(
"My Alarm");

 

       Alarm a = new Alarm("My Alarm")
       {
              Content = 
"Alarm",
              BeginTime = DateTime.Now.AddMinutes(1)
       };
       ScheduledActionService.Add(a);
}

 

 

 

public void setReminder()

 

{

 

       if (ScheduledActionService.Find("My Reminder") != null)

 

              ScheduledActionService.Remove("My Reminder");

 

       Reminder r = new Reminder("My Reminder")

 

       {

 

              Content = "Remind Me",

 

              BeginTime = DateTime.Now.AddMinutes(1),

 

              Title = "My Title"

 

       };

 

       ScheduledActionService.Add(r); 
}
 

 

 



推荐阅读
  • 本文详细介绍了GetModuleFileName函数的用法,该函数可以用于获取当前模块所在的路径,方便进行文件操作和读取配置信息。文章通过示例代码和详细的解释,帮助读者理解和使用该函数。同时,还提供了相关的API函数声明和说明。 ... [详细]
  • 本文介绍了lua语言中闭包的特性及其在模式匹配、日期处理、编译和模块化等方面的应用。lua中的闭包是严格遵循词法定界的第一类值,函数可以作为变量自由传递,也可以作为参数传递给其他函数。这些特性使得lua语言具有极大的灵活性,为程序开发带来了便利。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • C# 7.0 新特性:基于Tuple的“多”返回值方法
    本文介绍了C# 7.0中基于Tuple的“多”返回值方法的使用。通过对C# 6.0及更早版本的做法进行回顾,提出了问题:如何使一个方法可返回多个返回值。然后详细介绍了C# 7.0中使用Tuple的写法,并给出了示例代码。最后,总结了该新特性的优点。 ... [详细]
author-avatar
兰州老头_337
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有