Windows Phone - 开发来电显示应用

时间:2012-11-01 12:41:26

标签: windows-phone

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

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

  1. 检测来电并获取来电号码
  2. 如果在联系人中找不到该号码,请在我们的服务器上进行名称搜索(HTTP获取XML接口请求)
  3. 如果从我们的服务器找到名称,则在手机响铃时将其显示在屏幕上
  4. (其他内容,例如将结果存储到联系人等)
  5. 我们在Android和Symbian上实现了应用程序,它运行良好。我想知道在Windows Phone上是否可以使用这种类型的应用程序。据我们的分包商说,以前的版本并非如此。我想知道这是否真的如果WP8中的情况发生了变化。

    我的问题:

    1. 应用程序可以作为后台进程运行吗?
    2. 来电是否会触发后台进程可以检测到的事件?
    3. 您是否可以实时接听来电中的来电号码?
    4. 您可以在来电期间在后台执行搜索吗?
    5. 来电期间,您可以在屏幕上显示任何内容吗?
    6. 根据我用Google搜索,我发现只提到“模糊”事件,没有关于“呼叫”事件或类似事件。这不是很有希望,但我想听听实际开发人员的意见。

1 个答案:

答案 0 :(得分:1)

是(查看“后台代理”,http://www.jeffblankenburg.com/2011/11/25/31-days-of-mango-day-25-background-agents/)。

您应该从那里开始,然后执行与您的应用规范相关的更多独立研究。

Per Jeff的文章:

启动Visual Studio并创建一个新项目。在Silverlight for Windows Phone下,选择Windows Phone应用程序。将其命名为“MyAgentApp”。

您现在已经创建了主应用程序。它将负责两件事:

1)拥有后台代理可以使用信息更新的实时磁贴

2)启动和停止后台代理

后台代理本身必须存在于自己的特殊项目中。在解决方案中添加新项目,选择Windows Phone Scheduled Task Agent。将其命名为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()表示您正在取消您的任务。为了让任务以一定的间隔运行,只需不要调用,这就是我们在这里所做的。