65.9K
CodeProject 正在变化。 阅读更多。
Home

在 Windows Phone 8 应用中使用后台代理更新应用磁贴

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.67/5 (6投票s)

2014 年 6 月 1 日

CPOL

6分钟阅读

viewsIcon

18205

downloadIcon

47

如何在 Windows Phone 8 应用中使用后台代理更新应用磁贴

后台代理和计划任务允许您的应用程序在后台执行代码,即使应用程序未在前台运行。这在各种场景中都非常有用,例如您希望频繁更新动态磁贴、在从 Web 服务获取数据时显示 Toast 通知、执行数据同步等。在本教程中,我们将探讨如何使用后台代理更新 Windows Phone 8 应用程序中的应用程序磁贴

Windows Phone API 包含 ScheduledTaskAgent 类,可用于创建按周期计划运行的后台代理。可以创建两种类型的任务:

  • PeriodicTask:这适用于执行时间较短的场景。它每 30 分钟运行一次,适用于执行诸如发出通知、更新磁贴等任务。
  • ResourceIntensiveTask:这适用于执行需要长时间的操作。此任务执行 10 分钟,但必须满足许多与处理器活动相关的条件才能执行该任务。您可以在执行诸如同步数据或上传图片等耗时操作时使用此功能。

一个 Windows Phone 应用程序只能有一个后台代理,但它可以同时注册 PeriodicTaskResourceIntensiveTask。如果应用程序注册了两种类型的任务,它们都会以不同的间隔执行。这些任务可以使用有限的内存量,大约在给定时间为 11 MB。如果内存使用量增加,任务将立即终止。如果代理因未处理的异常而连续两次终止,它们将自动从计划中移除。

这两个任务的生命周期都有限,并且设置为从首次注册之日起两周后到期,因此最好在到期前重新注册。在某些情况下,例如代理更新应用程序磁贴、锁屏通知,后台代理会自动续订。

有一些不支持的 API 调用,您根本无法从代理中进行,包括访问设备相机、剪贴板、浏览器等。根据设备的内存使用情况或设备是否处于省电模式,代理有可能不会运行。

现在让我们创建一个简单的应用程序来演示后台代理。我们的应用程序将显示一些随机名言。它还将包含一个计划任务代理,它将定期在应用程序的宽磁贴上显示名言。

打开 Visual Studio -> 新建项目 -> Windows Phone 空白应用,并将应用程序命名为“WPBackgroundAgentApp”。

右键单击解决方案并添加另一个类型为“类库(可移植)”的项目,并将其命名为“Quotes.DataAccess”,如下所示

单击“确定”后,您将看到一个对话框,选择如下所示的设置

最好为数据访问创建一个单独的类,因为这样计划代理和我们的 Windows Phone 应用程序都可以引用它。向 DataAccess 项目添加一个名为“QuotesRepository.cs”的类。该类的代码将如下所示

public class QuotesRepository
    {
        public List<string> QuotesList = new List<string>
        {
            "Attitude is a little thing that makes a big difference",
            "We are all in the gutter but some of us are looking at the stars",
            "Be not afraid of going slowly, but be afraid of standing still",
            "Don't let what you can't do stop you from doing what you can do",
            "The man who makes no mistakes does not usually make anything"
        };

        public string GetRandomQuote()
        {
            int randomNumber = (new Random()).Next(QuotesList.Count - 1);
            return QuotesList[randomNumber];
        }
    }

我们添加了一个函数 GetRandomQuote(),它将从名言列表中返回一个随机名言。通常,您的数据访问将包含用于访问数据库或某些存储机制以获取数据的代码。为了简单起见和演示目的,我们使用一个简单的列表作为我们的数据存储。

向项目添加计划任务代理

向解决方案添加一个新项目。在新项目对话框中,选择“Windows Phone 计划任务代理”,并将其命名为“QuotesTaskAgent1”。

项目加载后,您会注意到它包含一个名为 ScheduledAgent 的单个类,该类派生自 ScheduledTaskAgent。它包含一个方法 OnInvoke(),当调用计划任务时,该方法会被调用。您应该将要执行的代码放在此方法中。

在当前项目中添加对 Quotes.DataAccess 项目的引用。在 ScheduledAgent.cs 文件中添加以下 using 指令。

using Quotes.DataAccess;
using Microsoft.Phone.Shell;
using System.Linq;
using System;

我们的 OnInvoke() 将包含以下代码

protected override void OnInvoke(ScheduledTask task)
{
    //TODO: Add code to perform your task in background
    if (task is PeriodicTask)
    {
        QuotesRepository repository = new QuotesRepository();
        string quotes = repository.GetRandomQuote();

        FlipTileData flipTileData = new FlipTileData()
        {
            BackContent = quotes,
            WideBackContent = quotes

        };

        ShellTile appTile = ShellTile.ActiveTiles.First();
        if (appTile != null)
        {
            appTile.Update(flipTileData);
        }
    }

    #if DEBUG
      ScheduledActionService.LaunchForTest(task.Name, TimeSpan.FromSeconds(60));
    #endif

    NotifyComplete();
}

我们首先检查任务是否是 PeriodicTask。当您使用单个代理时,这不是必需的,但是当您同时使用 PeriodicTaskResourceIntensiveTask 时,您可以在此处分支您的代码。然后,代码调用存储库中的 GetRandomQuote() 方法来获取一个随机名言。然后它创建一个 FlipTileData 对象来更新应用程序磁贴。

在应用程序开发过程中,LaunchForTest() 方法用于按频繁计划启动方法,然后它将在原始设备上运行。这仅在通过开发工具部署的应用程序上运行,而不是在生产应用程序上运行。您应该从生产应用程序中删除对此方法的调用。最后调用 NotifyComplete(),让操作系统知道我们的代理已完成执行代码。

将代理与应用程序集成

在我们的 Windows Phone 应用程序项目中,添加对后台代理的引用。在“添加引用”对话框中,选择“项目”选项卡。选择代理项目 QuotesTaskAgent1,然后单击“确定”。

我们还需要更新清单文件以注册我们的代理。右键单击 WMAppManifest.xml 文件,然后单击“查看代码”。在 Tasks 元素中,添加 ExtendedTask 元素,使其显示如下所示

<Tasks>
  <DefaultTask Name="_default" NavigationPage="MainPage.xaml" />
  <ExtendedTask Name="RandomQuoteTask">
    <BackgroundServiceAgent Specifier="ScheduledTaskAgent" Name="RandomQuoteTask" 
     Source="QuotesTaskAgent1" Type="QuotesTaskAgent1.ScheduledAgent" />
  </ExtendedTask>
</Tasks>

指定器应为 ScheduledTaskAgent 类型,NameSource 应使用您在创建 Agent 时提供的名称。

现在,我们将在前台应用程序中添加代码来注册代理。打开“MainPage.xaml.cs”文件,并添加一个名为 RegisterAgent()private 方法,其中包含以下代码

public MainPage()
        {
            InitializeComponent();
            RegisterAgent();
            // Sample code to localize the ApplicationBar
            //BuildLocalizedApplicationBar();
        }

        private void RegisterAgent()
        {
            string taskName = "RandomQuoteTask";
            try
            {

                if (ScheduledActionService.Find(taskName) != null)
                {
                    //if the agent exists, remove and then add it to ensure
                    //the agent's schedule is updated to avoid expiration
                    ScheduledActionService.Remove(taskName);
                }

                PeriodicTask periodicTask = new PeriodicTask(taskName);
                periodicTask.Description = "Random Quote Update On Tile";
                ScheduledActionService.Add(periodicTask);

#if DEBUG
                ScheduledActionService.LaunchForTest(taskName, TimeSpan.FromSeconds(30));
#endif
            }
            catch (InvalidOperationException exception)
            {
                MessageBox.Show(exception.Message);
            }
            catch (SchedulerServiceException schedulerException)
            {
                MessageBox.Show(schedulerException.Message);
            }
        }

您还需要在 Windows Phone 项目中添加对“Quotes.DataAccess”项目的引用,并在顶部添加以下 using 指令。

using Microsoft.Phone.Scheduler;
using Quotes.DataAccess;

在上述方法中,我们通过提供名称和描述来创建一个 PeriodicTask 对象,并通过调用 ScheduledActionServiceAdd 方法将其注册到操作系统。我们还检查任务是否已注册。如果它已注册,我们会在重新注册之前先将其删除,以延长到期期限。然后我们从 MainPage 构造函数中调用 RegisterAgent 方法。有时设备的代理限制可能已达到,您的 Agent 将不会注册。在这种情况下,您需要包含一些错误处理代码来提醒用户。

现在我们需要修改清单文件以添加对宽磁贴的支持。打开“WPAppManifest.xml”文件,并勾选“支持大磁贴”复选框,如下所示

在模拟器中测试

现在让我们在模拟器中测试该应用程序。运行应用程序后,您将进入应用程序主页。单击 GetQuote 按钮,它会在屏幕上显示一个随机名言。您需要将磁贴固定到开始屏幕。如果磁贴成功固定,您将被带到手机开始屏幕。默认情况下,中等大小的磁贴固定到开始屏幕。点击并按住磁贴以更改大小。第一次大小更改将切换到小磁贴大小。下一次大小更改将扩展到大而宽的磁贴大小。等待 30 秒,您将看到磁贴更新为随机名言。

 

在此示例中,我们看到了如何使用后台代理更新应用程序磁贴。您还可以执行不同的操作,例如进行一些 Http 调用以获取数据,然后使用 Toast 通知显示数据。

© . All rights reserved.