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 注冊任務時傳入的參數一致(為了聲明后台代理的權限以及要運行代理邏輯的命名空間)

image

對於后台任務代碼實現部分簡單的說分為兩個部分

 第一部分:運行的邏輯體本身(業務邏輯部分)你需要創建一個后台任務類(具體步驟借用MSDN原話)

你可以通過編寫用於實現 IBackgroundTask 接口的類來在后台運行代碼。在使用諸如 SystemTriggerMaintenanceTrigger 等觸發器觸發特定事件時,將運行該代碼。

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

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

    注意  后台任務類本身(以及后台任務項目中的所有其他類)必須是屬於 sealedpublic 類。

//
// 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

image

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

image

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

image

image

這里有一個注冊后台代理的代碼給大家參考下(可以直接使用。 注:這里的 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 觸發器的方法體的方法上面事件觸發器的形式是一致的。這個觸發器的作用顧名思義 就是當應用更新完成以后激發。

image

 

除了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 分鍾運行一次該任務。

  • 注意  如果 FreshnessTime 設置為少於 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);

 

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

 

image

 

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

image

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

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

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM