Windows Phone 8 - Background Schedule Task改變鎖定螢幕的背景

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的任務;如下畫面;

       image

 

(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) 執行結果

       122123(a) 預設先設定b.png為背景圖,右圖為設定結果;

       124125(b) 透過background agent更新的結果;

[註] 圖片所有權不屬於本文章,因此,只暫用圖示,範例中的使用到的圖示,請大家自行選擇適合的圖示,謝謝

 

[程式範例]

======

以上是分享透過Background Schedule Agent修改lock screen background的功能,其實很適合做在那裡呢?

動態手機相框或是以前很流行的美女報時,只是30分鐘更新的區間,其實說起來就沒有像其他的平台這

麼方便了。不過這個功能我覺得還是蠻有趣的,來當作下一個App實作的題材吧,也希望對大家有所幫助。

 

References:

Windows Phone 8 - 修改鎖定螢幕的背景

Windows Phone 7 – Background Schedule Tasks

WP7多任务处理之---PeriodicTask

How to: Implement Background Agents for Windows Phone

 

Dotblogs Tags: