修炼九阴真经Windows Phone开发 (10):计划通知Reminder和Alarm 及ScheduledActionService类 总结
上一节示例说明了 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:
呈现的型式:
‧Application Name:为建立该Alarm的应用程式名称;
‧Alarm:为类型名称,是固定的;
‧Alarm Content:为实际建立Alarm时所指定的Content讯息;
‧snooze:点击后,将触发应用程式设定復发时间,等待重新復发Alarm;
‧dimiss:点击后,结束该Alarm;
‧Sound:指定需要的音效,呈现音效时将由音量小的声音慢慢变大起来。
B. Reminder:
呈现的型式:
‧Application Name:为建立该Alarm的应用程式名称;
‧Reminder Tile:为应用程式建立Reminder时所指定的标题;
‧Alarm Content:为实际建立Reminder时所指定的Content讯息;
‧Snooze for:指定要延迟(贪睡)的时间长度;
‧snooze/dismiss:点击后,均会启动应用程式,或是应用程式指定的特定Page,并且转到特定Page时也可以使用QueryString夹带参数;
‧Sound:Reminder採用预设的音效进行播放;
了解Alarm与Reminder二种类型之后,接下来针对如何使用这二者时几个需要了解的属性与类别加以说明:
‧ScheuldedNotifcation:
针对该类别不管在使用Alarm与Reminder时均会使用的属性加以说明:
类别 | 属性 | 说明 |
Reminder | NavigationUri | 设定/取得当Reminder执行时,用户点击snooze后前往应用程式指定的Navigation Uri。 |
Reminder | Title | 取得通知讯息的标题。 |
Alarm/Reminder | Content | 设定/取得通知的文字内文。 |
Alarm/Reminder | BeginTime | 设定/取得Action的排程启动时间。 |
Alarm/Reminder | ExpirationTime | 设定/取得Action的排程到期时间。 |
Alarm/Reminder | RecurrenceType | 设定/取得通知的RecurrenceType类型。 |
Alarm | Sound | 设定/取得当Alarm执行要播放的声音档案。 |
Alarm/Reminder | IsScheduled | 取得Action的排程状态。 |
Alarm/Reminder | Name | 取得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);
}