【问题标题】:Windows Phone - developing a caller ID appWindows Phone - 开发来电显示应用
【发布时间】:2012-11-01 12:41:25
【问题描述】:

我自己不是 Windows Phone 开发人员,因此对于我缺乏知识,我提前道歉。

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

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

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

我的问题:

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

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

【问题讨论】:

    标签: windows-phone


    【解决方案1】:

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

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

    根据 Jeff 的文章:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 2013-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      相关资源
      最近更新 更多