エクスポート (0) 印刷
すべて展開
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 のバックグラウンドで位置追跡アプリを実行する方法

2014/06/18

対象: Windows Phone 8

このトピックでは、バックグラウンドで実行される位置追跡アプリを作成する方法について説明します。バックグラウンドで実行されるアプリと、そのベスト プラクティスおよび機能の制限については、「Windows Phone 8 のバックグラウンドで位置情報追跡アプリを実行する」を参照してください。

このトピックでは、バックグラウンドで実行される位置追跡アプリを作成するための次の作業について説明します。

  1. バックグラウンド実行が有効になるようにアプリを変更します。

  2. RunningInBackground イベントのハンドラーを実装します。アプリがアクティブに位置を追跡している間に、ユーザーがバックグラウンド実行対応のアプリから別の場所に移動するときに、このイベントが生成されます。このイベントが生成された時点で、アプリの UI の更新を含め、アプリは位置追跡に関係しないすべてのタスクを停止する必要があります。バックグラウンドでの実行中に使用できる Windows Phone API の一覧については、「Windows Phone 8 のバックグラウンドでの実行中に使用できる機能」を参照してください。

重要:重要:

アプリで Location 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. 位置追跡アプリがバックグラウンドで実行されている場合は、標準アプリとは少し異なる方法でアプリの再起動が処理されます。開発者がアプリの動作方法を把握できるように、このサンプル アプリでは 2 つのページを使用しています。最初のページは単純に 2 番目のページにリンクし、2 番目のページは位置追跡を実装します。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 縦向きページ] を選択することで、2 番目のページを追加します。新しいページに "Page2.xaml" という名前を付けます。

  12. Page2.xaml で、"ContentPanel" という名前の付いた Grid 要素を次のコードで置き換えます。このコードは 2 つの 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 を起動します。トーストの 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();
    
        }
    }
    
    
    

表示:
© 2015 Microsoft