如何調用windows phone 7.1的後台鬧鐘功能 step by step

來源:互聯網
上載者:User

自從 WP7.1之後,windows phone 開放一些後台調用,包括音樂,鬧鐘,播放器等,相信在做windows phone開發時,有可能會調用後台, 恰好我們的軟體工程中需要用到鬧鐘提醒功能,現在就把具體的細節一步一步告訴大家。

包括實現多項提醒,儲存和顯示等功能。

1. 簡介

Reminder是我們Microsoft Academic Search (MAS) 的Windows Phone 7的一個應用的模組,用來提醒使用者會議中每個session的開始。使用者可以設定reminder的開始時間,結束時間,reminder的訊息以及鈴聲,同時使用者也可以刪除已經存在的reminder。我需要做的就是提供建立和刪除reminder的API,已經管理現有的reminders。下面我就談一談我在實現過程中的方法,遇到的困難,教訓以及解決方案。

2. 如何在Memory中儲存ReminderList

程式運行時,需要在記憶體中儲存臨時的ReminderList的資訊。下面我談談這個部分我的經驗與總結。

2.1. 資料結構

選擇何時的資料結構是非常重要的。我一開始打算使用C#的Dictionary和Tuple,結果發現Windows Phone並不支援Tuple,於是我自己定義了一個class Tuple5並且把它用作Dictionary的Value的Type。Class Tuple5的代碼如下:

 1 public class Tuple5<T1, T2, T3, T4, T5>
2 {
3 public T1 Item1 { get; set; }
4 public T2 Item2 { get; set; }
5 public T3 Item3 { get; set; }
6 public T4 Item4 { get; set; }
7 public T5 Item5 { get; set; }
8
9 public Tuple5(T1 item1, T2 item2, T3 item3, T4 item4, T5 item5)
10 {
11 Item1 = item1;
12 Item2 = item2;
13 Item3 = item3;
14 Item4 = item4;
15 Item5 = item5;
16 }
17 }

 

儲存ReminderList的Dictionary的type如下:

Dictionary<uint, Tuple5<DateTime, DateTime, string, RecurrenceInterval, Uri>>

 

其中uint是我給每個Reminder分配的一個Universally Unique Identifier (UUID),Tuple5裡面五個參數分別為Reminder的開始時間,結束時間,訊息,重複響鈴頻率和音效檔的地址。這樣我就可以用這個Dictionary來儲存我們的ReminderList了。

2.2. 使用Windows Phone的Alarm

為了讓我們的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;

然後就是使用傳進來的開始時間beginTime,結束時間stopTime,訊息message,重複響鈴頻率recurrence和音效檔的地址sound來建立一個Alram對象並且加入Scheduler,代碼如下:

1 Alarm alarm = new Alarm(name);
2 alarm.Content = message;
3 alarm.Sound = sound;
4 alarm.BeginTime = beginTime;
5 alarm.ExpirationTime = stopTime;
6 alarm.RecurrenceType = recurrence;
7 ScheduledActionService.Add(alarm);

 

3. 如何在檔案系統中儲存ReminderList

因為使用者佈建的Alarm在下次啟動程式的時候還要求能夠刪除和修改,所以必須要將現有的Alarms存在檔案系統裡。下面我講一下我的經驗。

3.1. Serialization的失敗

我一開始嘗試使用C#的XmlSerializer和DataContractSerializer來儲存我的Dictionary,但是我經過一天的嘗試,最終以失敗結束。下面我就XmlSerializer談談我的實現方法。

我一開始嘗試使用XmlSerializer來將我的Dictionary存成xml檔案,然後下次直接從xml檔案讀取這個Dictionary。代碼如下:

 1 XmlSerializer ser = new XmlSerializer(typeof(Dictionary<uint, Tuple5<DateTime, DateTime, string, RecurrenceInterval, Uri>>));
2
3 // write
4 using (var stream = File.Create("ReminderList.xml"))
5 {
6 ser.Serialize(stream, ReminderList); // your instance
7 }
8
9 // read
10 using (var stream = File.OpenRead("ReminderList.xml"))
11 {
12 ReminderList = (Dictionary<uint, Tuple5<DateTime, DateTime, string, RecurrenceInterval, Uri>>)ser.Deserialize(stream);
13 }

最後編譯時間提示我Uri不能被Serialized。於是我將Uri改成string,他還是提示我Tuple5的Serialization出錯,於是我仔細研究這個,嘗試了幾種方法,包括在我的class Tuple5的定義加上[Serializable()]的屬性,最後還是沒有成功,於是我開始考慮自己將Dictionary轉化成檔案。

3.2. 自己將Dictionary轉化成檔案

因為使用Serialization失敗,我開始自己將Dictionary存入檔案,我使用了最簡單的方法,就是將每個item一行行以string形式存入檔案,代碼如下:

 1 // Obtain the virtual store for the application.
2 IsolatedStorageFile myStore = IO.GetUserStore();
3 myStore.CreateDirectory("Reminder");
4
5 // Specify the file path and options.
6 using (var isoFileStream = new IsolatedStorageFileStream("Reminder\\ReminderList.dat", FileMode.OpenOrCreate, myStore))
7 {
8 //Write the data
9 using (var isoFileWriter = new StreamWriter(isoFileStream))
10 {
11 foreach (KeyValuePair<uint, Tuple5<DateTime, DateTime, string, RecurrenceInterval, Uri>> kvp in ReminderList)
12 {
13 isoFileWriter.WriteLine(Convert.ToString(kvp.Key));
14 isoFileWriter.WriteLine(kvp.Value.Item1.ToString());
15 isoFileWriter.WriteLine(kvp.Value.Item2.ToString());
16 isoFileWriter.WriteLine(kvp.Value.Item3);
17 isoFileWriter.WriteLine(kvp.Value.Item4.ToString());
18 if (kvp.Value.Item5 != null)
19 {
20 isoFileWriter.WriteLine(kvp.Value.Item5.AbsoluteUri);
21 }
22 else
23 {
24 isoFileWriter.WriteLine("");
25 }
26 }
27 }
28 }

 

有一點要說明的是,Windows Phone使用的是獨立的隱藏檔IsolatedStorageFile,與PC上並不一樣。

3.3. 從檔案中讀取ReminderList

每次啟動時,都要能夠從檔案中讀取ReminderList。我是寫了一個靜態建構函式來從檔案讀取ReminderList。靜態建構函式有一個對象被聲明就會調用,且整個程式只調用一次,從檔案讀取ReminderList的代碼如下:

 1 // Obtain a virtual store for the application.
2 IsolatedStorageFile myStore = IsolatedStorageFile.GetUserStoreForApplication();
3
4 try
5 {
6 // Specify the file path and options.
7 using (var isoFileStream = new IsolatedStorageFileStream("Reminder\\ReminderList.dat", FileMode.Open, myStore))
8 {
9 // Read the data.
10 using (var isoFileReader = new StreamReader(isoFileStream))
11 {
12 string line = null;
13 while ((line = isoFileReader.ReadLine()) != null)
14 {
15 uint newId = Convert.ToUInt32(line);
16 line = isoFileReader.ReadLine();
17 DateTime startTime = DateTime.Parse(line);
18 line = isoFileReader.ReadLine();
19 DateTime stopTime = DateTime.Parse(line);
20 line = isoFileReader.ReadLine();
21 string message = line;
22 line = isoFileReader.ReadLine();
23 RecurrenceInterval recurrence = RecurrenceInterval.None;
24 switch (line)
25 {
26 case "None": recurrence = RecurrenceInterval.None; break;
27 case "Daily": recurrence = RecurrenceInterval.Daily; break;
28 case "EndOfMonth": recurrence = RecurrenceInterval.EndOfMonth; break;
29 case "Monthly": recurrence = RecurrenceInterval.Monthly; break;
30 case "Weekly": recurrence = RecurrenceInterval.Weekly; break;
31 case "Yearly": recurrence = RecurrenceInterval.Yearly; break;
32 default: recurrence = RecurrenceInterval.None; break;
33 }
34
35 line = isoFileReader.ReadLine();
36 Uri sound = null;
37 if (line != "")
38 {
39 sound = new Uri(line, UriKind.Relative);
40 }
41 Tuple5<DateTime, DateTime, string, RecurrenceInterval, Uri> newReminder = new Tuple5<DateTime, DateTime, string, RecurrenceInterval, Uri>(startTime, stopTime, message, recurrence, sound);
42 ReminderList.Add(newId, newReminder);
43 }
44 }
45 }
46 }
47 catch
48 {
49 // TODO:
50 }

 

4. 其他細節

雖然實現了Reminder的模組,我還是考慮了很多需要完善的細節,下面舉出兩個例子。

4.1. 重複的Reminder

使用者在設定同一個session的reminder的時候,可能會修改設定,但是在我的程式裡就會導致設定兩個alarms,於是調用者對於同一個session必須先delete這個alarm(用之前create alarm返回的ID),然後才能建立新的。

4.2. 刪去到期的Reminder

有些Alarms已經過了stopTime了,系統需要定期刪掉這些Alarms。我是在每次建立新的alarm之前清理到期的alarms。

下面就是我花了將近三天時間研磨總結出來的,如果感覺對你有用,請推薦我們,相信這是對我們新手開發windows phone過程中的鼓勵!

歡迎批評指正!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.