מדריך Windows Phone

מדריך Windows Phone – הרצת משימות ברקע

‏ • Sela

בגרסת "מנגו" של מערכת ההפעלה Windows Phone קיבלנו יכולת של הרצת משימות ברקע, גם כאשר האפליקציה שלנו לא רצה.

הרצה של קוד ברקע מתבצעת ע"י מימוש Scheduled Task Agent, כאשר יש שני סוגים של משימות שניתן להריץ ברקע, ולכל סוג יש הגבלות משלו.

הסוג הראשון נקרא Periodic agent והוא נועד למשימות שצריכות להריץ מעט קוד (שמשך הרצתו לוקח עד 25 שניות) אבל בתכיפות גבוהה (כל 30 דקות).

הסוג השני נקרא Resource-intensive agent והוא נועד למשימות שצריכות הרבה זמן כדי לרוץ (עד 10 דקות). לסוג זה יש דרישות יוצר מחמירות:

  • דורש שהמכשיר יהיה מחובר לחשמל
  • לפחות 90% מהסוללה טעונה
  • דורש חיבור אינטרנט מסוג Wi-Fi או דרך חיבור ישיר למחשב (ללא תקשורת סלולארית)
  • רץ רק כאשר המכשיר נעול
  • רק אם אין שיחה פעילה

נעיר כי מערכת ההפעלה עלולה להפסיק להריץ משימה באמצע פעולתה, אם היא רואה שהמשימה כבר לא עומדת בדרישות (למשל הנעילה מתבטלת).

 

הוספת Task Scheduler Agent

כעת נראה את הצעדים הדרושים להוספת משימה שרצה ברקע:

שלב 1: צרו פרויקט חדש מסוג Windows Phone Task Scheduler Agent

מדריך Windows Phone – הרצת משימות ברקע

 

פרויקט זה הוא מסוג DLL והוא יכיל את הקוד של המשימה שנרצה להריץ.

 

שלב 2: מימוש הקוד במשימה

בפרויקט החדש שנוצר קיבלנו מחלקה שיורשת מהמחלקה ScheduledTaskAgent. כעת יש לדרוס את הפונקציה OnInvoke כדי לממש את תוכן המשימה. פונקציה זו תקרא בכל פעם שהמשימה תרוץ.

לדוגמא, בכל פעם שהקוד הבא ירוץ ברגע הוא יפתח הודעת Toast חדשה (ראה תמונה בהמשך).

    protected override void OnInvoke(ScheduledTask task)
    {
      //TODO: Add code to perform your task in background
      string toastMessage = "";

      // If your application uses both PeriodicTask and ResourceIntensiveTask
      // you can branch your application code here. Otherwise, you don't need to.
      if (task is PeriodicTask)
      {
        // Execute periodic task actions here.
        toastMessage = "Periodic task running.";
      }
      else
      {
        // Execute resource-intensive task actions here.
        toastMessage = "Resource-intensive task running.";
      }

      // Launch a toast to show that the agent is running.
      // The toast will not be shown if the foreground application is running.
      ShellToast toast = new ShellToast();
      toast.Title = "Background Agent Sample";
      toast.Content = toastMessage;
      toast.Show();

      // If debugging is enabled, launch the agent again in one minute.
#if DEBUG_AGENT
  ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));
#endif

      // Call NotifyComplete to let the system know the agent is done working.
      NotifyComplete();

    }

נעיר כי אנו קוראים לפונקציה ScheduledActionService.LaunchForTest רק למטרות דיבוג התוכנית, שכן אחרת היינו צריכים להמתין 30 דקות עד שהמשימה תקרא (וזה עוד בתנאי שזו משימה מסוג PeriodicTask).

בתמונה הבאה ניתן לראות את תוצאת הרצת המשימה כאשר התוכנית לא מופעלת – קפצה הודעת Toast לפי בקשתנו. כמובן שבאפליקציה אמתית נבחר לבצע קוד שימושי יותר.

 

מדריך Windows Phone – הרצת משימות ברקע

 

 

שלב 3: יצירת אפליקציה ושימוש ב DLL שיצרנו

עד כה רק הגדרנו את המשימה ומה היא עושה בתוך DLL משלה. כעת ניצור אפליקציה שתגרום למשימה שלנו להתחיל לרוץ.

לצורך כך ניצור אפליקציית Windows Phone רגילה ונוסיף ל References את הפרויקט DLL שיצרנו בסעיף הראשון.

 

שלב 4: הוספת המשימה לרשימת המשימות הרצות

כעת ע"י שימוש בקוד הבא ניתן להוסיף את המשימה שיצרנו בסעיפים הקודמים למשימה שתרוץ ברקע, גם כאשר האפליקציה שלנו כבר לא רצה.

במידה ונרצה ליצור את המשימה שלנו כ Periodic Task נשתמש בקטע הקוד הבא:

PeriodicTask periodicTask = new PeriodicTask(periodicTaskName);

// The description is required for periodic agents. This is the string that the user
// will see in the background services Settings page on the device.

periodicTask.Description = "This demonstrates a periodic task.";

// Place the call to Add in a try block in case the user has disabled agents.
try
{
  ScheduledActionService.Add(periodicTask);

  // If debugging is enabled, use LaunchForTest to launch the agent in one minute.
#if(DEBUG_AGENT)
  ScheduledActionService.LaunchForTest(periodicTaskName, TimeSpan.FromSeconds(60));
#endif
}
catch (InvalidOperationException exception)
{
  if (exception.Message.Contains("BNS Error: The action is disabled"))
  {
    MessageBox.Show("Background agents for this application have been disabled by the user.");
  }
}

כאשר השימוש במחלקה PeriodicTask אומר שהמשימה תרוץ כ Periodic Task. השימוש ב ScheduledActionService.Add הוא זה שמוסיף את המשימה לאוסף המשימות שרצות ברקע.

אם נרצה לעבוד עם Resource-intensive Task נשתמש בקטע הקוד הבא:

ResourceIntensiveTask resourceIntensiveTask = new ResourceIntensiveTask(resourceIntensiveTaskName);

// The description is required for periodic agents. This is the string that the user
// will see in the background services Settings page on the device.

resourceIntensiveTask.Description = "This demonstrates a resource-intensive task.";

// Place the call to Add in a try block in case the user has disabled agents.
try
{
  ScheduledActionService.Add(resourceIntensiveTask);

  // If debugging is enabled, use LaunchForTest to launch the agent in one minute.
#if(DEBUG_AGENT)
  ScheduledActionService.LaunchForTest(resourceIntensiveTaskName, TimeSpan.FromSeconds(60));
#endif
}
catch (InvalidOperationException exception)
{
  if (exception.Message.Contains("BNS Error: The action is disabled"))
  {
    MessageBox.Show("Background agents for this application have been disabled by the user.");
  }
}

תגיות: , , , ,

arikp

אריק פוזננסקי הוא יועץ בכיר ומרצה בסלע. הוא השלים שני תארי B.Sc. במתמטיקה ומדעי המחשב בהצטיינות יתרה בטכניון. לאריק ידע נרחב בטכנולוגיות מיקרוסופט, כולל .NET עם C#, WPF, Silverlight, WinForms, Interop, COM/ATL, C++ Win32 ו reverse engineering.

תגובות בפייסבוק