1

我自己不是 Windows Phone 开发人员,所以我提前为我缺乏知识表示歉意。

我们为客户提供的产品之一是来电显示应用程序。该软件执行以下操作:

  1. 检测来电并获取来电号码
  2. 如果在联系人中找不到号码,请在我们的服务器上进行姓名搜索(对 XML 接口的 HTTP Get 请求)
  3. 如果从我们的服务器中找到姓名,请在电话响铃时将其显示在屏幕上
  4. (其他东西,例如将结果存储到联系人等)

我们已经在 Android 和 Symbian 上实现了该应用程序,并且运行良好。我想知道这种类型的应用程序是否甚至可以在 Windows Phone 上使用。据我们的分包商称,以前的版本并非如此。我想知道这是否真的是真的,以及 WP8 中的情况是否发生了变化。

我的问题:

  1. 应用程序可以作为后台进程运行吗?
  2. 来电是否会触发后台进程可以检测到的事件?
  3. 您可以实时从来电中获取来电者电话号码吗?
  4. 您可以在来电期间在后台执行搜索吗?
  5. 您可以在来电期间在屏幕上显示任何内容吗?

从我用谷歌搜索的内容来看,我只发现提到了“模糊”事件,没有提到“呼叫”事件或类似事件。这不是很有希望,但我想听听实际开发人员的意见。

4

1 回答 1

1

是的(查找“后台代理”,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() 来表示您正在取消任务。要保持任务按间隔运行,只需不要调用任何一个,这就是我们在这里所做的。

于 2012-12-10T16:50:04.020 回答