Windows Phone 8 - Background Schedule Task改變鎖定螢幕的背景
剛好寫完了<Windows Phone 8 - 修改鎖定螢幕的背景>這一篇介紹WP 8的新功能,讓自己的應用程式變換
鎖定螢幕的背景。那麼,這一篇想介紹的是如何結合Background Schedule Task在定期時間更換鎖定螢幕的背景。
對於Background Schedule Task如果有點陌生的話,可以參考<Windows Phone 7 – Background Schedule Tasks>這篇
所撰寫的詳細內容,有助於先了解Background Schedule Task的特性與限制。
以下直接談實作的步驟與程式碼範例:
(0) 事件準備:
延用<Windows Phone 8 - 修改鎖定螢幕的背景>的範例,準備四張美麗的圖像,並且為MainPage.xaml加上啟動
Background Schedule Task的任務;如下畫面;
(1) 在範例中WMAppManifest.xml檔案裡的<Tasks />加上<ExtendedTask />:
1: <Tasks>
2: <DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/>
3: <!-- 加上定義Background Task -->
4: <ExtendedTask Name="BackgroundTask">
5: <!-- Name, Source, Type 為實作Background Agent的專案 -->
6: <BackgroundServiceAgent Specifier="ScheduledTaskAgent"
7: Name="ScheduledTaskAgentSBP"
8: Source="ScheduledTaskAgentSBP"
9: Type="ScheduledTaskAgentSBP.ScheduledAgent" />
10: </ExtendedTask>
11: </Tasks>
Specifier是固定的值,Name、Source與Type為實作Background Schedule Agent的專案與類別名稱。
(2) 為新按鈕加上Click處理事件,啟動Background Schedule Agent至ScheduleActionService中:
1: private void btnSchedule_Click(object sender, RoutedEventArgs e)
2: {
3: // 啟動前先檢查是否有存在的PeriodicTask
4: if (ScheduledActionService.Find("PeriodicTask") != null)
5: ScheduledActionService.Remove("PeriodicTask");
6:
7: // 建立一個新的PeriodicTask物件,並且設定2個小時後過期;
8: PeriodicTask tTask = new PeriodicTask("PeriodicTask");
9: tTask.Description = "Background change lock screen background!!";
10: tTask.ExpirationTime = DateTime.Now.AddHours(2);
11: ScheduledActionService.Add(tTask);
12:
13: // 在Debug模式下,利用LauchForTest進行測試。
14: //#if DEBUG_AGENT
15: ScheduledActionService.LaunchForTest("PeriodicTask", TimeSpan.FromSeconds(3));
16: //#endif
17: }
上述建立一個PeriodicTask的物件,並且加入至ShceduleActionSrevice,為了測試時比較快速的反應,
利用「ScheduledActionService.LaunchForTest」加快測試。因為PeriodicTask在正式手機裡運作的是每30分鐘執行一次,
因此,範例中加快了它執行的測試效果。
(3) 在範例專案中加入一個新的Background Schedule Agent的專案,命名為:ScheduledTaskAgentSBP;
該專案的概念為將範例專案中「Assets/Images」資料下的檔案做為鎖定螢幕的更換來源,因此,該專案需要
取得應用程式安裝目錄(Installed folder)下「Assets/Images」資料夾中的檔案。如下說明:
(3-1). 在background schedule task中的主要運作方法:OnInvoke()加入要執行的任務;
1: protected override void OnInvoke(ScheduledTask task)
2: {
3: //TODO: Add code to perform your task in background
4: //改變Lock screen background的方法。
5: ChangeLSBP();
6:
7: NotifyComplete();
8: }
(3-2). 加入ChangeLSBP()方法的實現邏輯;
1: private List<string> gImageList = new List<string>() { "a.jpg", "b.jpg", "c.jpg", "d.jpg", "e.jpg" };
2:
3: /// <summary>
4: /// 改變Lock screen background的方法。
5: /// </summary>
6: private void ChangeLSBP()
7: {
8: string tResult = string.Empty;
9: try
10: {
11: //識別目前是否為lock screen background provider
12: var isProvider = Windows.Phone.System.UserProfile.LockScreenManager.IsProvidedByCurrentApplication;
13: //由於在background agent 不可以使用LockScreenManager.RequestAccessAsync()
14: //所以如果非預設的provider,則不會往下進行。
15: if (isProvider)
16: {
17: //取得放置於安裝目錄下Assets/Images中的檔案
18: string filePathOfTheImage = GetNextImage();
19: var uri = new Uri(filePathOfTheImage, UriKind.Absolute);
20:
21: // Set the lock screen background image.
22: Windows.Phone.System.UserProfile.LockScreen.SetImageUri(uri);
23:
24: // Get the URI of the lock screen background image.
25: var currentImage = Windows.Phone.System.UserProfile.LockScreen.GetImageUri();
26: System.Diagnostics.Debug.WriteLine("The new lock screen background image is set to {0}", currentImage.ToString());
27: //MessageBox.Show(string.Format("success!! \n{0}", currentImage.AbsolutePath), "Info", MessageBoxButton.OK);
28: tResult = string.Format("success!! \n{0}", currentImage.AbsolutePath);
29: }
30: else
31: {
32: //MessageBox.Show("You said no, so I can't update your background.");
33: tResult = "You said no, so I can't update your background.";
34: }
35: }
36: catch (System.Exception ex)
37: {
38: //System.Diagnostics.Debug.WriteLine(ex.ToString());
39: tResult = ex.Message;
40: }
41: finally{
42: ShellToast tToast = new ShellToast();
43: tToast.Title = "LSBP";
44: tToast.Content = tResult;
45: tToast.Show();
46: }
47: }
先透過先識別目前的App是否為lock screen background provider再往下進行,由於background agent無法使用
LockScreenManager.RequestAccessAsync(),所以上述程式裡直接判斷非provider就不支援。
接著配合取得路徑的機制GetNextImage(),往下一張圖示更換;
(3-3). 取得下一張圖片並組合對應URI的方法;
1: /// <summary>
2: /// 往下一張圖片進行讀取
3: /// </summary>
4: /// <returns></returns>
5: private string GetNextImage()
6: {
7: string tCurrentImg = IsolatedStorageSettings.ApplicationSettings["LockScreenImage"].ToString();
8: int tIdx = gImageList.IndexOf(tCurrentImg);
9:
10: tIdx++;
11: if (tIdx >= gImageList.Count)
12: tIdx = 0; //循環的處理
13: //重新組合路徑
14: string tImgPath = "ms-appx:///Assets/Images/" + gImageList[tIdx];
15: return tImgPath;
16: }
由於放置於Assets/Images目錄下的圖像設定為Content的Build Action,在安裝XAP時會一併安裝至Installed Folder裡,
因此,透過「ms-appx:///」組合URI字串加以回傳;上述還有針對圖像陣列往下一張圖的判斷。
(4) 執行結果:
[註] 圖片所有權不屬於本文章,因此,只暫用圖示,範例中的使用到的圖示,請大家自行選擇適合的圖示,謝謝。
[程式範例]
======
以上是分享透過Background Schedule Agent修改lock screen background的功能,其實很適合做在那裡呢?
動態手機相框或是以前很流行的美女報時,只是30分鐘更新的區間,其實說起來就沒有像其他的平台這
麼方便了。不過這個功能我覺得還是蠻有趣的,來當作下一個App實作的題材吧,也希望對大家有所幫助。
References:
‧Windows Phone 7 – Background Schedule Tasks
‧How to: Implement Background Agents for Windows Phone