预装任务

OEM 和 MO 允许在设备映像中提供预安装的应用。 在这些预安装的应用中,有些会要求在无用户交互的情况下并且通常是在最终用户首次打开该应用之前运行任务;例如,产品调查应用或短信服务器注册。 同样,有些应用将需要在更新了应用后在无用户交互的情况下运行维护任务。 预安装和更新任务提供了允许任务在后台运行(无需在安装应用之前或在更新应用时)的机制。

UAP 可使用两种部署任务类型:PreInstallConfigTask 和 UpdateTask。 这两者都是 IBackgroundTask。

下面是控制这些任务的一般规则。

  • 应用清单只能包含一个 PreInstallConfigTask 和一个 UpdateTask。
  • 部署任务适用于任何平台类型。
  • 部署任务可在部署操作完成并提交后执行。
  • 失败的部署任务不会重启。
  • 失败的部署任务不会影响应用的成功部署。
  • 重新启动后不会重启部署任务。
  • 部署任务不应彼此依赖。

代码示例

UpdateTask 示例

任何可能的更新路径都支持更新任务,例如:

  • .xap 到 .xap
  • .xap 到 .appx
  • .xap 到 .appxbundle
  • .appx 到 .appx
  • .appx 到 .appxbundle
  • .appxbundle 到 .appxbundle

下面是 .appx 清单示例:

<Package>
  <Extensions>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>App.dll</Path>
        <ActivatableClass ActivatableClassId="App.UpdateTask" ThreadingModel="MTA"/>
      </InProcessServer>
    </Extension>
  </Extensions>

  <Applications>
    <Application>
      <Extensions>
        <Extension Category="windows.updateTask"  EntryPoint="App.UpdateTask">
        </Extension>
      </Extensions>
    </Application>
  </Applications>
</Package>

下面是 C# 代码示例:

public sealed class UpdateTask : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        var deferral = taskInstance.GetDeferral();
        taskInstance.Canceled +=
            (sender, reason) =>
            {
                cts.Cancel();
            };
        try
        {
            await MigrateApp(); // Do app migration/update steps.
        }
        catch (TaskCanceledException x)
        {
            // do nothing on cancelation.
        }
        deferral.Complete();
    }
}

PreInstallConfigTask 任务示例

下面是 .appx 清单示例:

<Package>
  <Extensions>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>App.dll</Path>
        <ActivatableClass ActivatableClassId="App.PreInstallConfigTask" ThreadingModel="MTA"/>
      </InProcessServer>
    </Extension>
  </Extensions>

  <Applications>
    <Application>
      <Extensions>
        <Extension Category="windows.preInstalledConfigTask"  EntryPoint=" App.PreInstallConfigTask">
        </Extension>
      </Extensions>
    </Application>
  </Applications>
</Package>

下面是 C# 代码示例:

public sealed class PreInstallConfigTask : IBackgroundTask
{
    public async void Run(IBackgroundTaskInstance taskInstance)
    {
        CancellationTokenSource cts = new CancellationTokenSource();
        var deferral = taskInstance.GetDeferral();
        taskInstance.Canceled +=
            (sender, reason) =>
            {
                cts.Cancel();
            };
        try
        {
            await DownloadContactList(); // Do app migration/update steps.
        }
        catch (TaskCanceledException x)
        {
            // do nothing on cancelation.
        }
        deferral.Complete();
    }
}

预安装适合经典 Windows 应用的任务

经典 Windows 应用可采用 3 种部署任务类型,如下表所示。 如果在 Windows 10 上部署经典 Windows 应用,这些任务将按预期工作。

任务 说明
PREINSTALL _OEM_TASK 第一方或第二方预安装的应用可运行安装时任务,而无需最终用户启动该应用。
UPDATE_TASK 更新应用(包括 .appx 到 .uap)后,可运行维护任务来执行任何与迁移相关的任务,这也无需任何用户交互。
CONVERGENCE Windows 8.1 和 Windows 8.1 Phone 代码收敛。 此外,启用统一的 .appx 清单架构。