是的(查找“后台代理”,http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/)。
您应该从那里开始,然后执行与您的应用程序规范相关的更多独立研究。
根据杰夫的文章:
启动 Visual Studio 并创建一个新项目。在 Silverlight for Windows Phone 下,选择 Windows Phone 应用程序。将其命名为“MyAgentApp”。
您现在已经创建了主应用程序。它将负责两件事:
1) 拥有后台代理可以更新信息的动态磁贴
2)启动和停止后台代理
后台代理本身必须存在于自己的特殊项目中。将新项目添加到您的解决方案,选择 Windows Phone 计划任务代理。将其命名为 MyAgent。此项目将包含您的自定义代码,这些代码将在后台运行并更新动态磁贴。
最后,这很重要,转到 MyAgentApp 项目并添加对 MyAgent 的项目引用。这将允许您从应用程序中注册您的代理。另外,请注意在 WMAppManifest.xml 中自动创建的条目:
<Tasks>
<DefaultTask Name="_default" NavigationPage="MainPage.xaml" />
<ExtendedTask Name="BackgroundTask">
<BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="MyAgent" Source="MyAgent" Type="MyAgent.ScheduledAgent" />
</ExtendedTask>
</Tasks>
现在是时候把所有东西都连接起来了。打开 MainPage.xaml 并添加两个按钮,一个用于启动代理,另一个用于停止代理:
<StackPanel VerticalAlignment="Center">
<Button Content="Start Background Agent"
Click="StartButton_Click"/>
<Button Content="Stop Background Agent"
Click="StopButton_Click"/>
</StackPanel>
在 MainPage.xaml.cs 中,连接按钮以启动和停止代理:
private const string TASK_NAME = "MyAgent";
private void StartButton_Click(object sender, RoutedEventArgs e)
{
StartAgent();
}
private void StopButton_Click(object sender, RoutedEventArgs e)
{
StopAgentIfStarted();
}
private void StartAgent()
{
StopAgentIfStarted();
PeriodicTask task = new PeriodicTask(TASK_NAME);
task.Description = "This is our custom agent for Day 25 - Background Agents";
ScheduledActionService.Add(task);
#if DEBUG
// If we're debugging, attempt to start the task immediately
ScheduledActionService.LaunchForTest(TASK_NAME, new TimeSpan(0, 0, 1));
#endif
}
private void StopAgentIfStarted()
{
if (ScheduledActionService.Find(TASK_NAME) != null)
{
ScheduledActionService.Remove(TASK_NAME);
}
}
请注意,要创建我们的自定义代理,我们正在创建一个新的 PeriodicTask。然后,我们在查找和停止代理时使用该名称作为标识符。另请注意,我们指定了 PeriodicTask.Description – 这是必填字段,将出现在 Settings | 我们应用程序名称下的后台任务。
在 MyAgent 项目中,打开 ScheduledAgent.cs 并添加以下代码:
protected override void OnInvoke(ScheduledTask task)
{
UpdateAppTile(GetLastUpdatedTimeMessage());
}
private string GetLastUpdatedTimeMessage()
{
return string.Format("Last Updated: {0}", DateTime.Now);
}
private void UpdateAppTile(string message)
{
ShellTile appTile = ShellTile.ActiveTiles.First();
if (appTile != null)
{
StandardTileData tileData = new StandardTileData
{
BackContent = message
};
appTile.Update(tileData);
}
}
ScheduledAgent 有一个重要的重写方法——OnInvoke。这是您的代理将执行其后台任务的地方。如果您的任务已完成并且您不再需要运行代理,则可以调用 NotifyComplete() 来表示任务已成功完成,或者调用 Abort() 来表示您正在取消任务。要保持任务按间隔运行,只需不要调用任何一个,这就是我们在这里所做的。