信息
您所需的主题如下所示。但此主题未包含在此库中。

如何在 Windows Phone 8 的后台运行位置跟踪应用

2014/6/18

适用于:Windows Phone 8

本主题演示如何创建在后台运行的位置跟踪应用。有关在后台运行的应用的信息,包括最佳做法和功能限制,请参见在后台运行 Windows Phone 8 的位置跟踪应用

本主题介绍为创建在后台运行的位置跟踪应用所需执行的任务,如下所示。

  1. 修改应用清单文件以启用后台执行。

  2. RunningInBackground 事件实现一个处理程序。当正在活跃地跟踪位置时,在用户导航离开启用了后台执行的应用时引发此事件。当引发此事件时,应用应停止所有与位置跟踪无关的任务,包括对应用 UI 的更新。有关可以在后台执行期间使用的 Windows Phone API 列表,请参见在 Windows Phone 8 的后台运行时可以使用的功能

重要说明重要说明:

要在应用中使用位置 API,您必须在应用的清单文件中包含 ID_CAP_LOCATION 功能。如果不这样做,将在开发期间部署应用时在应用中引发异常,并且,在您将应用提交到 Windows Phone 应用商店 时,它将无法被接收。有关 Windows Phone 的应用功能的更多信息,请参见 Windows Phone 8 应用功能和硬件要求

支持位置跟踪应用在后台运行

  1. 创建一个新 Windows Phone 应用。

  2. 将 ID_CAP_LOCATION 添加到应用清单 XML 文件中。在“解决方案资源管理器”中,展开“属性”文件夹,然后双击 WMAppManifest.xml。在清单设计器的“功能”选项卡上,选中 ID_CAP_LOCATION 旁边的复选框。

  3. 通过修改应用清单文件启用后台执行。对于此任务,您需要直接编辑应用清单,而不是使用清单编辑器。为此,右键单击 WMAppManifest.xml,单击“打开方式”,然后选择“XML(文本)编辑器”

  4. 使用以下代码覆盖 DefaultTasks 元素。

    <DefaultTask Name="_default" NavigationPage="MainPage.xaml">
      <BackgroundExecution>
        <ExecutionType  Name="LocationTracking" />
      </BackgroundExecution>
    </DefaultTask>
    
  5. 在 App.xaml 中,使用以下代码覆盖 shell:PhoneApplicationService 元素。这将为 RunningInBackground 事件注册事件处理程序。

    
    <shell:PhoneApplicationService 
        Launching="Application_Launching" Closing="Application_Closing" 
        Activated="Application_Activated" Deactivated="Application_Deactivated"
        RunningInBackground="Application_RunningInBackground"/>
    
    
    
  6. 在 App.xaml.cs 中,添加声明以便使用 Windows.Devices.Geolocation 命名空间。

  7. 在 App.xaml.cs 中,声明一些将作为应用程序的全局变量的静态变量。其中包括一个可以在页面和布尔变量之间共享的 Geolocator 对象 RunningInBackground,将用于跟踪应用是否在后台或前台运行。这使应用在后台运行时能够挂起不必要的任务,例如更新 UI。

    
    public static Geolocator Geolocator { get; set; }
    public static bool RunningInBackground { get; set; }
    
    
    
  8. 在 App.xaml.cs 中,添加 RunningInBackground 事件处理程序。当它活跃地跟踪位置时,在用户导航离开应用并且应用开始在后台运行时会引发此事件。在此事件处理程序中,RunningInBackground 全局变量设置为 true。

    
    private void Application_RunningInBackground(object sender, RunningInBackgroundEventArgs args)
    {
        RunningInBackground = true;
        // Suspend all unnecessary processing such as UI updates
    }
    
    
    
  9. 在 App.xaml.cs 中,更新 Application_Activated 方法以将 RunningInBackground 全局变量设置回 false。如果应用正在后台运行,并且用户启动了该应用(例如通过点击应用的开始磁贴),将调用此方法(Activated 事件的处理程序)。此时,应用应恢复前台任务,比如更新 UI。

    
    private void Application_Activated(object sender, ActivatedEventArgs e)
    {
        RunningInBackground = false;
    }
    
    
    
  10. 当位置应用在后台运行时,它处理应用重启的方式与标准应用相比稍有不同。此示例应用使用了两个页面,以便您能够了解其工作方式。第一页将链接到第二页,这将实现位置跟踪。在 MainPage.xaml 中,将名为 ContentPanel 的 Grid 元素替换为以下代码。这会添加一个 HyperlinkButton,将导航至应用的另一页面。

    
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <HyperlinkButton NavigateUri="/Page2.xaml" Content="go to page 2"/>
    </Grid>
    
    
    
  11. 将第二个页面添加到应用,方式是进入“项目”菜单,单击“添加新项…”,然后选择“Windows Phone 纵向页面”。将新页面命名为“Page2.xaml”。

  12. 在 Page2.xaml 中,将名为 ContentPanel 的 Grid 元素替换为以下代码。这会添加两个 TextBlock 控件,以在应用在后台运行时显示纬度和经度。

    
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel>
            <TextBlock x:Name="LatitudeTextBlock" Text="latitude"/>
            <TextBlock x:Name="LongitudeTextBlock" Text="longitude"/>
        </StackPanel>
    </Grid>
    
    
    
  13. 重写 OnNavigatedTo(NavigationEventArgs) 方法以初始化 Geolocator 对象(如果尚未初始化),同时挂接 PositionChanged 事件的处理程序。在这里,您还可以挂接 StatusChanged 事件。将以下方法粘贴到 Page2.xaml.cs 中。

    
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (App.Geolocator == null)
        {
            App.Geolocator = new Geolocator();
            App.Geolocator.DesiredAccuracy = PositionAccuracy.High;
            App.Geolocator.MovementThreshold = 100; // The units are meters.
            App.Geolocator.PositionChanged += geolocator_PositionChanged;
        }
    }
    
    
    
  14. 在 Page2.xaml.cs 中,添加 OnRemovedFromJournal(JournalEntryRemovedEventArgs) 方法的重写。当页面从应用的日记移除时,会调用此方法。这意味着,如果应用再次显示此页面,将创建新的实例。在此方法中,删除事件处理程序,并将 Geolocator 设置为 null。

    
    protected override void OnRemovedFromJournal(System.Windows.Navigation.JournalEntryRemovedEventArgs e)
    {
        App.Geolocator.PositionChanged -= geolocator_PositionChanged;
        App.Geolocator = null;
    }
    
    
    
  15. 实现 PositionChanged 事件处理程序。检查全局变量 RunningInBackground 的值。如果值为 false,则应用在前台运行,并且 BeginInvoke(Action) 被用于更新 UI 线程上具有当前位置的文本块。如果值为 true,则应用正在后台运行。不应更新 UI。相反,在本示例中,启动了具有当前位置的 ShellToast。Toast 的 NavigationUri 被设置为 Page2.xaml。在应用重启时,此 Uri 将被用于阐释应用的页面管理行为。

    
    void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
    
        if (!App.RunningInBackground)
        {
            Dispatcher.BeginInvoke(() =>
            {
                LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00");
                LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00");
            });
        }
        else
        {
            Microsoft.Phone.Shell.ShellToast toast = new Microsoft.Phone.Shell.ShellToast();
            toast.Content = args.Position.Coordinate.Latitude.ToString("0.00");
            toast.Title = "Location: ";
            toast.NavigationUri = new Uri("/Page2.xaml", UriKind.Relative);
            toast.Show();
    
        }
    }
    
    
    

显示: