For more posts in this series, see the series index.
When you start with development of Windows Store apps, you may want to run tasks in the background and an important aspect of that is deciding if you want to be a lock screen app or not. Microsoft has a guide on this, which is ESSENTIAL reading so this post should be seen as a cheat sheet for a portion of that document.
Triggers
Background tasks kick off on a trigger so what triggers can lock screen & non-lock screen apps use. Non-lock screen apps can run background tasks based on
Background task trigger type | Trigger event | When the background task is triggered |
MaintenanceTrigger | MaintenanceTrigger | It’s time for maintenance background tasks. |
SystemEventTrigger | InternetAvailable | The Internet becomes available. |
SystemEventTrigger | LockScreenApplicationAdded | An app tile is added to the lock screen. |
SystemEventTrigger | LockScreenApplicationRemoved | An app tile is removed from the lock screen. |
SystemEventTrigger | NetworkStateChange | A network change such as a change in cost or connectivity occurs. |
SystemEventTrigger | OnlineIdConnectedStateChange | Online ID associated with the account changes. |
SystemEventTrigger | ServicingComplete | The system has finished updating an application. |
SystemEventTrigger | SessionDisconnected | The session is disconnected. |
SystemEventTrigger | SmsReceived | A new SMS message is received by an installed mobile broadband device. |
SystemEventTrigger | TimeZoneChange | The time zone changes on the device (for example, when the system adjusts the clock for daylight saving time). |
Lock screen apps can use those and much more, the extra triggers for lock screen apps are
Background task trigger type | Trigger event | When the background task is triggered |
ControlChannelTrigger | ControlChannelTrigger | On incoming messages on the control channel. |
PushNotificationTrigger | PushNotificationTrigger | A raw notification arrives on the WNS channel. |
SystemEventTrigger | ControlChannelReset | A network channel is reset. |
SystemEventTrigger | SessionDisconnected | The session is disconnected. |
SystemEventTrigger | UserAway | The user becomes absent. |
SystemEventTrigger | UserPresent | The user becomes present. |
TimeTrigger | TimeTrigger | A time event occurs. |
CPU
Now we know when the background task will happen, how much CPU can background task consume during it’s execution is also affected by lock screen & non-lock screen.
Before we look at the table there is three things to know:
- This is per app – NOT per background task!
- Think of the refresh period as the point were we get filled up with more resources. So you can run multiple background tasks and they all consume from the pool of resources. At the refresh period the bucket is filled & any unused time will be lost.
- CPU second is not the same as a real second. A CPU second is the amount of time that is consumed by the CPU – so if you are doing I/O (like a download) then it is not counted.
| CPU resource quota | Refresh period |
Lock screen app | 2 CPU seconds | 15 minutes |
Non-lock screen app | 1 CPU second | 2 hours |
Bandwidth
In a similar way to CPU the amount of data you can consume is also effected by being a lock screen app, but in addition to that the average speed of your internet also effects the amount of data. There is another difference to CPU, rather than one bucket – there is two:
- Small period: The shorter amount of time and has a small amount it can be downloaded.
- Day: The max per day – so accumulation of all the smaller ones cannot exceed this.
The table below has 1Mb & 10Mb as the average speed options but you could think of them as 1Mb = WiFi and 10Mb plugged into a network. These amounts are the top end, so if the network is slow you get less.
Average throughput | Lock screen apps | Non-lock screen apps | ||
Every 15min | Per day | Every 2 hours | Per day | |
1Mb/s | 0.469Mb | 4.69Mb | 0.625Mb | 7.5Mb |
10Mb/s | 4.69Mb | 450Mb | 6.25Mb | 75Mb |
Global Pool
Above we have looked at the resource constraints for CPU & bandwidth but what happens if that isn’t enough? Windows has a global pool of additional CPU & bandwidth resources that are shared system wide. This means that if you need 2.5CPU seconds you will likely get it! However the global pool is shared across all the apps, so it is not guaranteed (the above resources we have looked at are guaranteed). So if you have some abusive apps that use it, then your app may not get anything from the global pool. The global pool is replenished every 15min.
You can test your app works with an empty global pool, and you really should do this, by turning it off in the registry
Value name | Type | Default value | Description |
HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\BackgroundModel\Policy\CpuEnableGlobalPool | DWORD | 1 | Controls the CPU global pool. A value of zero disables CPU global pool. |
HKEY_LOCAL_MACHINE\ SOFTWARE\Microsoft\Windows NT\CurrentVersion\BackgroundModel\Policy\NetEnableGlobalPool | DWORD | 1 | Controls the network global pool. A value of zero disables network global pool. |
Control channel
Taken from Staying connected in the background.The network trigger feature supports two possible resource types for a push notification or keep-alive network trigger:
- Hardware slot - Allows the app to use background network notifications even in low-power or connected-standby mode.
- Software slot - Allows the app to use background network notifications but not in low-power or connected-standby mode.
This notion of slot is integral to the network trigger and is not required for WNS.
One of the options to specify while registering for the network trigger feature is the hardware or software slot resource type. This resource type capability provides a way for your app to be triggered by an incoming notification even if the device is in low power mode. By default, a software slot is selected if the developer does not specify an option. A software slot allows your app to be triggered when the system is not in connected standby. This is the default on most computers.
On the other hand, a hardware slot allows your app to be triggered at all times including when the system is in connected standby. Only systems with network devices that support connected standby will have a hardware slot. Note that the app cannot be triggered through a software or hardware slot when the system is in Sleep or Hibernate mode, or is shut down.
An app can create and use a maximum of 5 network triggers. There is also an additional system limitation on number of network triggers that specify hardware slots. The first 3 lock screen apps that register for a hardware slot for a network trigger can use a maximum of 3 hardware slots per app. Any other lock screen apps beyond the first three apps registered for hardware slots are limited to only software slots for their network triggers.