天天看點

Windows 8.1 應用開發背景任務概述(Windows XAML)

說到背景任務,這是在和許多 Android 開發者聊天的時候,經常被提起的話題之一, Windows 移動平台的背景任務的形式有别與 Android 的背景 service,簡單的說在 Windows RT 移動平台下隻有在滿足一定條件的時候才能運作一部分預先設定好的制的代碼。并且 Windows 8.1 和 Windows Phone 8.0 對背景任務有些差別,今天我就為大家介紹一下 Windows 8.1 移動平台下的背景任務,以及他們的運作條件。

首先給大家介紹下 Windows 移動平台的應用運作背景的情景分為多種。

今天我隻為大家介紹以下基礎任務,背景任務響應系統事件 ( 背景任務的運作條件、ServicingComplete  - 應用更新觸發器 )、維護觸發器、計時器背景任務,這些内容後面我一個一個的給大家介紹。

在此之前我先介紹下使用背景的應用配置。

手動在 Package.appxmanifest 檔案中聲明支援的背景任務類型

聲明在  <Extensions> 節點中

<Application Id="BackgroundTaskSample.App" Executable="BackgroundTaskSample.exe" EntryPoint="BackgroundTaskSample.App">
      <VisualElements DisplayName="BackgroundTaskSample" Logo="Images\squareTile-sdk.png" SmallLogo="Images\smallTile-sdk.png" Description="BackgroundTaskSample" ForegroundText="dark" BackgroundColor="#222222">
        <LockScreen Notification="badgeAndTileText" BadgeLogo="images\badgelogo.png" />
        <DefaultTile ShowName="allLogos" WideLogo="images\tile-sdk.png" />
        <SplashScreen Image="Images\splash-sdk.png" BackgroundColor="#FFFFFF" />
      </VisualElements>

      <Extensions>

          <!-- TODO: Add elements here -->

      </Extensions>

    </Application>      

例如:

<Extension Category="windows.backgroundTasks" EntryPoint="Tasks.BackgroundTaskClass">
         <BackgroundTasks>
           <Task Type="systemEvent" />
           <Task Type="pushNotification" />
         </BackgroundTasks>
</Extension>      

或者直接在 圖形化界面中滑鼠勾選 注意:這裡要手動輸入一個:Entry Point 這個字段很重要,這個字段要和後面 BackgroundTaskBuilder.TaskEntryPoint 注冊任務時傳入的參數一緻(為了聲明背景代理的權限以及要運作代理邏輯的命名空間)

對于背景任務代碼實作部分簡單的說分為兩個部分:

 第一部分:運作的邏輯體本身(業務邏輯部分)你需要建立一個背景任務類(具體步驟借用MSDN原話)

你可以通過編寫用于實作 IBackgroundTask 接口的類來在背景運作代碼。在使用諸如 SystemTrigger 或 MaintenanceTrigger 等觸發器觸發特定事件時,将運作該代碼。

以下步驟介紹如何編寫實作 IBackgroundTask 接口的一個新類。開始之前,在解決方案中為背景任務建立一個新項目。為背景任務添加一個新的空類,并導入Windows.ApplicationModel.Background 命名空間。

  • 為背景任務建立一個新項目并将其添加到你的解決方案。為此,請右鍵單擊你的解決方案并選擇“添加”->“建立項目”。然後選擇 Windows 運作時元件項目類型,命名項目,并單擊“确定”。
  • 從 Windows 應用商店應用引用背景任務項目。首先,右鍵單擊你的 Windows 應用商店應用項目并選擇“屬性,然後轉到“常見屬性”并單擊“添加新參考”,選中背景任務項目旁邊的複選框,然後單擊兩個對話框中的“确定”。
  • 建立一個實作 IBackgroundTask 接口的新類。Run 方法是在觸發指定的事件時必須調用的輸入點;每個背景任務中都需要該方法。

    注意  背景任務類本身(以及背景任務項目中的所有其他類)必須是屬于 sealed的 public 類。

//
// ExampleBackgroundTask.cs
//

using Windows.ApplicationModel.Background;

namespace Tasks
{
    public sealed class ExampleBackgroundTask : IBackgroundTask
    {
        public void Run(IBackgroundTaskInstance taskInstance)
        {
                BackgroundTaskDeferral _deferral = taskInstance.GetDeferral();
    
                //
                // TODO: Insert code to start one or more asynchronous methods using the
                //       await keyword, for example:
                //
                // await ExampleMethodAsync();
                //
    
                _deferral.Complete();
        }        
    }
}      

第二部分:在應用程式中注冊背景的代理 (在注冊背景代理的時候可以 選擇背景代理的類型以及代理的運作條件)

步驟 1: 定義方法簽名并傳回類型

此方法包含任務入口點、任務名稱、預建構的背景任務觸發器以及背景任務的SystemCondition(可選)。此方法傳回 BackgroundTaskRegistration 對象。

下面是捕獲系統事件的情況下激發背景任務,這裡叫做 SystemTrigger

Windows 8.1 應用開發背景任務概述(Windows XAML)

實際 8.1 SDK 中枚舉選項會多一些。

Windows 8.1 應用開發背景任務概述(Windows XAML)

為了我們背景代理執行的有效性 例如:隻有在機器聯網的情況下執行背景代理,windows移動平台的背景代理 為我們提供了 背景任務的執行條件選擇的機會。由 SystemConditionType 枚舉表示,在Win8.1 SDK 中實際會比截圖中的選項更多一些

Windows 8.1 應用開發背景任務概述(Windows XAML)
Windows 8.1 應用開發背景任務概述(Windows XAML)

這裡有一個注冊背景代理的代碼給大家參考下(可以直接使用。 注:這裡的 condition 其實是支援添加多個的)

//
// Register a background task with the specified taskEntryPoint, name, trigger,
// and condition (optional).
//
// taskEntryPoint: Task entry point for the background task.
// taskName: A name for the background task.
// trigger: The trigger for the background task.
// condition: Optional parameter. A conditional event that must be true for the task to fire.
//
public static BackgroundTaskRegistration RegisterBackgroundTask(string taskEntryPoint,
                                                                string taskName,
                                                                IBackgroundTrigger trigger,
                                                                IBackgroundCondition condition)
{
    //
    // Check for existing registrations of this background task.
    //

    foreach (var cur in BackgroundTaskRegistration.AllTasks)
    {

        if (cur.Value.Name == taskName)
        {
            // 
            // The task is already registered.
            // 

            return (BackgroundTaskRegistration)(cur.Value);
        }
    }


    //
    // Register the background task.
    //

    var builder = new BackgroundTaskBuilder();

    builder.Name = taskName;
    builder.TaskEntryPoint = taskEntryPoint;
    builder.SetTrigger(trigger);

    if (condition != null)
    {

        builder.AddCondition(condition);
    }

    BackgroundTaskRegistration task = builder.Register();

    return task;
}      

ServicingComplete 觸發器

寫ServicingComplete 觸發器的方法體的方法上面事件觸發器的形式是一緻的。這個觸發器的作用顧名思義 就是當應用更新完成以後激發。

除了SystemTrigger 還有 MaintenanceTrigger 維護觸發器

使用維護觸發器每 15 分鐘運作一次任務。維護任務僅在裝置插入交流電源時運作,而無需位于鎖屏上。這裡我還是引用一下 MSDN

建立新的 MaintenanceTrigger 對象。第二個參數 OneShot 指定維護任務是運作一次還是繼續定期運作。如果 OneShot 被設定為 true,則第一個參數 (FreshnessTime) 會指定在計劃背景任務之前需等待的分鐘數。如果 OneShot 被設定為 false,則 FreshnessTime 會指定背景任務的運作頻率。

注意  如果 FreshnessTime 設定為少于 15 分鐘,則在嘗試注冊背景任務時将引發異常。

int waitIntervalMinutes = 60;
MaintenanceTrigger taskTrigger = new MaintenanceTrigger(waitIntervalMinutes, false);
SystemCondition exampleCondition = new SystemCondition(SystemConditionType.InternetAvailable);
string entryPoint = "Tasks.ExampleBackgroundTaskClass";
string taskName   = "Maintenance background task example";
BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, taskTrigger, exampleCondition);      

計時器背景任務 建立方式還是與SystemTrigger十分相似。

建立時間觸發器

  • 建立新的 TimeTrigger。第二個參數 OneShot 指定背景任務是運作一次還是保持周期性運作。如果 OneShot 被設定為 true,則第一個參數 (FreshnessTime) 會指定在計劃背景任務之前需等待的分鐘數。如果 OneShot 被設定為 false,則FreshnessTime 會指定背景任務的運作頻率。

    Windows 8 具有以 15 分鐘間隔運作背景任務的内置計時器。

  • 如果 FreshnessTime 設定為 15 分鐘并且 OneShot 為 true,則任務将從其注冊之時起 0 至 15 分鐘内運作一次該任務。
  • 如果 FreshnessTime 設定為 15 分鐘并且 OneShot 為 false,則任務将從其注冊之時起 0 至 15 分鐘内每隔 15 分鐘運作一次該任務。
TimeTrigger hourlyTrigger = new TimeTrigger(60, false);

SystemCondition userCondition = new SystemCondition(SystemConditionType.UserPresent);

BackgroundExecutionManager.RequestAccessAsync();

string entryPoint = “Tasks.ExampleBackgroundTaskClass”;
string taskName   = “Example hourly background task”;

BackgroundTaskRegistration task = RegisterBackgroundTask(entryPoint, taskName, hourlyTrigger, userCondition);      

其他觸發器參考(這裡要注意的是使用限額):

Windows 8.1 應用開發背景任務概述(Windows XAML)

或者你的應用對背景實時性要求非常高 可以考慮下 :

Windows 8.1 應用開發背景任務概述(Windows XAML)

MSDN 說的非常拗口,我把它翻譯成人話說說,

PushNotificationTrigger 實際上就是在應用受到推送的時候才執行的背景代理,用來擴充推送對應用自身功能。

ControlChannelTrigger  是針對與一些應用無法使用 WNS 推送服務的一種解決方案,或者有關于隐私或消息服務級别協定 (SLA) 的問題時,通常需要此類。

詳情參考: http://msdn.microsoft.com/en-us/library/windows/apps/xaml/jj662741.aspx

繼續閱讀