Beat the Clock: Background Tasking in Windows 8


Published on

More info on

  • Be the first to comment

  • Be the first to like this

No Downloads
Total views
On SlideShare
From Embeds
Number of Embeds
Embeds 0
No embeds

No notes for slide

Beat the Clock: Background Tasking in Windows 8

  1. 1. Background TasksAllow apps to execute code when not active App is suspended, but background tasks execute No UI permitted except for tiles, toasts, and badgesBackground tasks implement IBackgroundTask Execute in response to triggers (e.g., SystemTrigger) Tasks can optionally have conditions attachedBackgroundTaskBuilder class provides API for registering backgroundtasks
  2. 2. Background Task ConstraintsCPU utilization is limited Applies to both AC and DC power Lock-screen apps get 2 seconds every 15 minutes Others receive 1 second every 2 hoursNetwork utilization is limited Limited on DC power; no limit for AC Bandwidth varies depending on network hardware  For example, WiFi gets more bandwidth than mobileIf quota is reached, task is temporarily suspended
  3. 3. Implementing a Background TaskAdd "Windows Runtime Component" project to solution and reference itfrom main projectAdd class that implements IBackgroundTask Must be public and sealed Override Run; use deferral if performing async callsRegister background task from main app First make sure it isnt already registered Specify trigger and (optionally) conditionsAdd background-task declaration to manifest
  4. 4. Implementing IBackgroundTasknamespace SampleBackgroundTask{ public sealed class TimeZoneTask : IBackgroundTask { public void Run(IBackgroundTaskInstance taskInstance) { // TODO: Add code that executes in the background } }}
  5. 5. Enumerating Background Tasksforeach (var task in BackgroundTaskRegistration.AllTasks){ var name = task.Value.Name;}
  6. 6. Registering a Background Taskvar builder = new BackgroundTaskBuilder();builder.Name = "TimeZoneTask";builder.TaskEntryPoint = "SampleBackgroundTask.TimeZoneTask";builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));builder.Register(); Recurring rather than one-shot
  7. 7. Declaring a Background Task
  8. 8. Unregistering a Background Taskforeach (var task in BackgroundTaskRegistration.AllTasks){ if (task.Value.Name == "TimeZoneTask") task.Value.Unregister(false);} Do not cancel instances of this task that are currently executing
  9. 9. TriggersBackground tasks run when triggers fire And when conditions are satisfied (more later)A background task must have exactly one trigger Specified with BackgroundTaskBuilder.SetTriggerSome triggers can be used by any app SystemTrigger and MaintenanceTriggerOthers can only be used by lock-screen apps TimerTrigger, PushNotificationTrigger, and ControlChannelTrigger
  10. 10. Trigger Types Req’s Lock Trigger Host Description Screen?System* Sometimes BTH See System Trigger Types At most every 15 minutes onMaintenance* No BTH 15 minute boundary; requires ACTimer* Yes BTH Like Maintenance; can be on batteryPushNotification Yes BTH / App When WNS pushes raw payloadControlChannel Yes App For RTC; not for JS*Can be 1-shot or repeatingBTH == BackgroundTaskHost.exe process (default if not in manifest)App ==App’s process
  11. 11. System Trigger TypesTypes that dont require a lock screen Type Description InternetAvailable Internet becomes available LockScreenApplicationAdded Your app is added to the lock screen LockScreenApplicationRemoved Your app is removed from the lock screen NetworkStateChange Network change occurs (e.g., cost change) OnlineIdConnectedStateChange Online ID associated with the account changes ServicingComplete Your app is updated SmsReceived Device receives an SMS (text) message TimeZoneChange Devices time zone changes
  12. 12. System Trigger Types, Cont.Types that require a lock screen Type Description Fires when a control channel representing a real-time ControlChannelReset network connection is reset and therefore might need to be reestablished SessionConnected Fires when the user logs in Fires when a period of inactivity indicates user is "away" UserAway (e.g., when the screen blanks) Fired when activity resumes, indicating user is present (e.g., UserPresent when the mouse is wiggled)
  13. 13. Registering an App-Update Taskvar builder = new BackgroundTaskBuilder();builder.Name = "UpdateTask";builder.TaskEntryPoint = "SampleBackgroundTask.AppUpdateTask";builder.SetTrigger(new SystemTrigger(SystemTriggerType.ServicingComplete));builder.Register();
  14. 14. Registering a Periodic Task// Register PeriodicTask to execute every 15 minutesvar builder = new BackgroundTaskBuilder();builder.Name = "PeriodicTask";builder.TaskEntryPoint = "SampleBackgroundTask.PeriodicTask";builder.SetTrigger(new MaintenanceTrigger(15, false));builder.Register(); Minimum 15 minutes Recurring rather than one-shot
  15. 15. ConditionsBackground tasks can have conditions attached Task runs when trigger fires and all conditions are met Added with BackgroundTaskBuilder.AddConditionWindows.ApplicationModel.Background.System-Condition class modelssystem conditions Whether Internet is available Whether user is logged in Whether user is present
  16. 16. Condition Types Type Description InternetAvailable Runs background task if Internet is available InternetNotAvailable Runs background task if Internet is not available SessionConnected Runs background task if user is logged in SessionDisconnected Runs background task if user is not logged in UserNotPresent Runs background task if user is not present UserPresent Runs background task if user is present
  17. 17. Adding a Conditionvar builder = new BackgroundTaskBuilder();builder.Name = "TimeZoneTask";builder.TaskEntryPoint = "SampleBackgroundTask.TimeZoneTask";builder.SetTrigger(new SystemTrigger(SystemTriggerType.TimeZoneChange, false));builder.AddCondition(new SystemCondition(SystemConditionType.InternetAvailable));builder.Register();
  18. 18. Passing Data from a TaskTask writes data to ApplicationData LocalSettings, LocalFolder, etc.App retrieves data from ApplicationData// Write result to LocalSettings in the background taskApplicationData.Current.LocalSettings.Values["Result"] = result;// Retrieve result from LocalSettings in the app (assumes result is a string)var result = (string)ApplicationData.Current.LocalSettings.Values["Result"];
  19. 19. Lock-Screen AppsApps that are added to the lock screen by users Lock screen can display up to 7 apps Apps display useful, at-a-glance, real-time informationMust implement background task using one of the following triggers,which are only available to lock-screen apps ControlChannelTrigger (always-connected RTC apps) PushNotificationTrigger (receipt of raw notifications) TimeTrigger (time-based, like MaintenanceTrigger)Afforded higher QOS than normal apps
  20. 20. What Can Lock-Screen Apps Do?
  21. 21. Making an App Lock-Screen CapableUse Application UI tab in manifest editor to specify what the app iscapable of Toast notifications, badge updates, tile-text updates Tile-text updates require wide logo App can display toast notifications App can update badge and tile text
  22. 22. Lock-Screen AccessOnly users can add apps to the lock screenBackgroundExecutionManager provides API for checking for andrequesting lock-screen access Type Description GetAccessStatus Indicates whether app has access to lock screen Prompts the user for access. Method is awaitable and returns RequestAccessAsync BackgroundAccessStatus value. Prompts user one time; subsequent invocations return users previous decision. RemoveAccess Removes an app from the lock screen
  23. 23. Checking for Lock-Screen Accessvar result = BackgroundExecutionManager.GetAccessStatus();switch (result){ case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: break; case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: break; case BackgroundAccessStatus.Denied: break; case BackgroundAccessStatus.Unspecified: break;}
  24. 24. Requesting Lock-Screen Accessvar result = await BackgroundExecutionManager.RequestAccessAsync();switch (result){ case BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity: break; case BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity: break; case BackgroundAccessStatus.Denied: break; case BackgroundAccessStatus.Unspecified: break;}
  25. 25. Using a TimeTriggervar status = BackgroundExecutionManager.GetAccessStatus();if (status == BackgroundAccessStatus.AllowedMayUseActiveRealTimeConnectivity || status == BackgroundAccessStatus.AllowedWithAlwaysOnRealTimeConnectivity){ var builder = new BackgroundTaskBuilder(); builder.Name = "TimerTask"; builder.TaskEntryPoint = "SampleBackgroundTask.TimerTask"; builder.SetTrigger(new TimeTrigger(15, false)); builder.Register();}
  26. 26. Updating a Lock-Screen Badge// Display a numeric badgevar xml = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeNumber);((XmlElement)xml.GetElementsByTagName("badge")[0]).SetAttribute("value", "7");var bu = BadgeUpdateManager.CreateBadgeUpdaterForApplication();bu.Update(new BadgeNotification(xml));// Display a glyph badgevar xml = BadgeUpdateManager.GetTemplateContent(BadgeTemplateType.BadgeGlyph);((XmlElement)xml.GetElementsByTagName("badge")[0]).SetAttribute("value", "newMessage");var bu = BadgeUpdateManager.CreateBadgeUpdaterForApplication();bu.Update(new BadgeNotification(xml));
  27. 27. Updating Lock-Screen Textvar xml = TileUpdateManager.GetTemplateContent(TileTemplateType.TileWideText05);var text = xml.GetElementsByTagName("text");text[0].InnerText = "Make awesome apps";text[1].InnerText = "BUILD Conference";text[2].InnerText = "9:00 AM - 11:00 AM";var tu = TileUpdateManager.CreateTileUpdaterForApplication();tu.Update(new TileNotification(xml));