此页面有用吗?
您对此内容的反馈非常重要。 请告诉我们您的想法。
更多反馈?
1500 个剩余字符
MSDN Library
信息
您所需的主题如下所示。但此主题未包含在此库中。

Windows Phone 8 的后台代理最佳做法

2014/6/18

适用于:Windows Phone 8 和 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

本主题包含为 Windows Phone 开发后台代理的重要考虑事项和最佳做法。

本主题包括以下部分。

调试后台代理时应该考虑以下事项。

  • 调试时使用 LaunchForTest(String, TimeSpan) 启动后台代理。连有调试器时系统不会启动定期代理。可以从前台应用调用该方法,也可以从后台代理调用该方法。

  • 对于 Windows Phone OS 7.1 应用,连有调试器时不强制实现内存和执行时间策略。一定要在不进行调试时测试您的代理,验证您的代理是否超出了内存上限或运行时间是否超过了为该代理类型分配的时间段。对于 Windows Phone 8 应用,调试时强制实现内存和执行时间策略。

  • 使用 ApplicationMemoryUsageLimit 查看前台应用和后台代理的内存限制。

在 Windows Phone OS 7.1 中,用户能够在手机的“设置”应用中为安装的每个应用禁用后台代理。如果已为您的应用禁用代理,则尝试使用 ScheduledActionServiceAdd(ScheduledAction) 方法将引发 InvalidOperationException,因此将对 Add 的调用放在 try 块中。如果引发异常并且与异常关联的消息为“BNS Error: The action is disabled(BNS 错误: 该操作已被禁用)”,则表示已为您的应用禁用代理。以下代码演示了处理这种情况的正确方法。

bool agentsAreEnabled = true;
PeriodicTask periodicTask = new PeriodicTask("MyPeriodicTask");
periodicTask.Description = "This demonstrates a periodic task.";

// Place the call to Add in a try block in case the user has disabled agents.
try
{
  ScheduledActionService.Add(periodicTask);
}
catch (InvalidOperationException exception)
{
  if (exception.Message.Contains("BNS Error: The action is disabled"))
  {
    MessageBox.Show("Background agents for this application have been disabled by the user.");
    agentsAreEnabled = false;
  }
  if (exception.Message.Contains("BNS Error: The maximum number of ScheduledActions of this type have already been added."))
  {
    // No user action required. The system prompts the user when the hard limit of periodic tasks has been reached.
  }
}
catch (SchedulerServiceException)
{
  // No user action required.
}

}

当定期后台代理的数量达到设备限制时,也会引发 InvalidOperationException。允许的代理数量因设备的硬件功能而异,但这个数量非常小,因此达到此限制很常见。出于此原因,您应在尝试添加定期任务时捕获此异常,这一点非常重要。添加任务时可能还会引发 SchedulerServiceException,例如,在设备刚刚启动而计划操作服务尚未启动的情况下就是如此。您应在添加计划任务时捕获此异常。

提示提示:

当应用的定期后台代理运行时,它会消耗少量的设备电池电量。为了延长电池寿命,用户可以在“设置”应用中为一个或多个应用禁用后台代理。但是,若要让用户轻松地在功能和电池寿命之间达到平衡,您可能需要向前台应用中添加功能,以使用户可以选择是否启用后台代理。

在前台应用和后台代理之间传递信息具有挑战性,因为无法预测代理和应用是否将同时运行。为此推荐以下模式。

  1. 对于定期和资源密集型代理:使用 LINQ 2 SQL 或独立存储中借助于 Mutex 保护的文件。对于前台应用写入而代理只读的单向通信,建议采用具有 Mutex 的独立存储文件技术。建议您不要使用 IsolatedStorageSettings 在进程之间通信,因为这样可能会损坏数据。

  2. 对于音频代理:将自定义数据存储在 AudioTrack 类的 Tag 属性中。对于从音频代理到前台应用的通知,请读取 PlayStateChanged 事件处理程序中的 Tag 属性。若要将数据从前台应用传递到音频代理,则在所实现的 OnPlayStateChanged(BackgroundAudioPlayer, AudioTrack, PlayState) 方法中读取当前曲目的 Tag 属性。

Windows Phone SDK 7.1 包含一个用于“Windows Phone 计划任务代理”后台代理的项目模板。实现后台代理时,您应该使用此模板向您的解决方案中添加项目。在您的前台应用项目中,通过选择“项目->添加引用...”,然后选择您的后台代理项目来添加对后台代理项目输出的引用。不应该在现有应用的项目中创建用来实现 ScheduledTaskAgent 的类。如果后台代理与前台应用位于相同的程序集中,则不会运行后台代理。

如果您重命名后台代理类或命名空间,则需要为您的前台应用手动更新应用清单文件。有关此文件的结构的信息,请参见 Windows Phone 8 的应用清单文件“TASKS 元素”部分。

由于后台代理的内存限制,如果应用动态生成要用作背景图像的图像,建议您以 WVGA 分辨率为目标并允许手机自动缩放图像以适应更高的分辨率屏幕。尝试生成更高分辨率的图像可能会导致代理超出内存上限。

显示:
© 2015 Microsoft