后台任務即是當應用程序處於掛起狀態時,不會影響由於程序持起而帶來的某些滯后而執行的一些后台操作,如下載文件、最新信息的推送等。當然,也應盡量減少一些沒有必要的后台操作,保證電池的壽命。
后台任務處理一般用於以下幾種情況:
4、共享文件
后台任務中一般經常會使用以下一些類和方法:
3、SystemTrigger 一個后台任務必須有一個明確的Trigger才執行后台任務,通過SetTrigger()添加,一般Trigger的類型有以下一些類型
| Background task trigger type |
Trigger event |
When the background task is triggered |
| ControlChannelTrigger |
ControlChannelTrigger |
On incoming messages on the control channel. |
| MaintenanceTrigger |
MaintenanceTrigger |
It’s time for maintenance background tasks. |
| PushNotificationTrigger |
PushNotificationTrigger |
A raw notification arrives on the WNS channel. |
| 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 |
ControlChannelReset |
A network channel is reset. |
| 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 |
SessionConnected |
The session is connected. |
| 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). |
| SystemEventTrigger |
UserAway |
The user becomes absent. |
| SystemEventTrigger |
UserPresent |
The user becomes present. |
| TimeTrigger |
TimeTrigger |
A time event occurs. |
4、SystemCondition
說了這么多,先來創建一個簡單的后台任務,功能非常簡單,就是后台任務定時刷新UI:
第一步:先創建一個空白的Metro項目,項目名為BackgroundProject
前台頁面放了兩個按鈕(注冊Task、注銷Task)、一個TextBlock控件(顯示后台任務的狀態)
第二步:創建一個Class Library,該類庫用於實現后台的具體任務,項目名為BackgroundSecniao,需要特別注意的時,這里需要將該項目的輸出更改為Winmd文件,不要默認生成DLL
第三步:在BackgroundSecniao中新建一個類TimerBackTask.cs類,該類必須繼承IBackgroundTask接口
{
volatile bool _cancelRequested = false;
BackgroundTaskDeferral _deferral = null;
ThreadPoolTimer _periodicTimer = null;
uint _progress = 0;
IBackgroundTaskInstance _taskInstance;
public void Run(IBackgroundTaskInstance taskInstance)
{
taskInstance.Canceled += new BackgroundTaskCanceledEventHandler(OnCanceled);
_deferral = taskInstance.GetDeferral();
_taskInstance = taskInstance;
_periodicTimer = ThreadPoolTimer.CreatePeriodicTimer(new TimerElapsedHandler(PeriodicTimerCallback), TimeSpan.FromMilliseconds(1000));
}
private void OnCanceled(IBackgroundTaskInstance sender, BackgroundTaskCancellationReason reason)
{
_cancelRequested = true;
}
private void PeriodicTimerCallback(ThreadPoolTimer timer)
{
if ((_cancelRequested == false) && (_progress < 100))
{
_progress += 10;
_taskInstance.Progress = _progress;
}
else
{
_periodicTimer.Cancel();
var settings = ApplicationData.Current.LocalSettings;
var key = _taskInstance.Task.TaskId.ToString();
if (_cancelRequested)
{
settings.Values[key] = "Canceled";
}
else
{
settings.Values[key] = "Completed";
}
_deferral.Complete();
}
}
第四步:BackgroundProject中的Package.appxmanifest需要設置下,需要在聲明中添加相應的后台任務
第五步:在Register按鈕中先注冊Task
builder.Name = SampleBackgroundTaskName;
builder.TaskEntryPoint = SampleBackgroundTaskEntryPoint;
SystemTrigger trigger = new SystemTrigger(SystemTriggerType.TimeZoneChange, false);
builder.SetTrigger(trigger);
SystemCondition condition = new SystemCondition(SystemConditionType.UserPresent);
if (condition != null)
{
builder.AddCondition(condition);
}
BackgroundTaskRegistration task = builder.Register();
task.Completed += task_Completed;
實現BackgroundTaskProgressEventHandler和BackgroundTaskCompletedEventArgs事件
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
var taskRegistration = sender as IBackgroundTaskRegistration;
var progressArgs = args as BackgroundTaskProgressEventArgs;
if ((taskRegistration != null) && (progressArgs != null))
{
tbProgress.Text = "Progress: " + progressArgs.Progress + "%";
}
});
}
void task_Completed(BackgroundTaskRegistration sender, BackgroundTaskCompletedEventArgs args)
{
Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() =>
{
try
{
var taskCompletion = sender as IBackgroundTaskRegistration;
var completionArgs = args as BackgroundTaskCompletedEventArgs;
if ((taskCompletion != null) && (completionArgs != null))
{
var key = taskCompletion.TaskId.ToString();
var settings = ApplicationData.Current.LocalSettings;
tbProgress.Text = settings.Values[key].ToString();
}
}
catch (Exception ex)
{
}
});
}
{
if (cur.Value.Name == SampleBackgroundTaskName)
{
cur.Value.Unregister(true);
}
}
在本地運行調試時,需要將TimerBackTask掛起,才能看到效果,掛起設斷點也可以Debug后台程序
后台任務還有好多東西要學習,如鎖屏時后台任務的執行、推送、后台任務與程序的生命周期等,內容相當之多,上面的是最基本最簡單的內容了!
