내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 백그라운드에서 위치 추적 앱을 실행하는 방법

2014-06-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. 앱 매니페스트 XML 파일에 ID_CAP_LOCATION을 추가합니다. 솔루션 탐색기에서 속성 폴더를 확장한 다음 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에서 응용프로그램에 전역으로 적용될 정적 변수를 선언합니다. 여기에는 페이지와 부울 변수 RunningInBackground 간에 공유할 수 있는 Geolocator 개체가 포함됩니다. 이 부울 변수는 앱이 실행 중 위치(백그라운드/포그라운드)를 추적하는 데 사용됩니다. 따라서 앱이 백그라운드에서 실행 중일 때는 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가 실행됩니다. 알림의 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();
    
        }
    }
    
    
    

Microsoft는 MSDN 웹 사이트에 대한 귀하의 의견을 이해하기 위해 온라인 설문 조사를 진행하고 있습니다. 참여하도록 선택하시면 MSDN 웹 사이트에서 나가실 때 온라인 설문 조사가 표시됩니다.

참여하시겠습니까?
표시:
© 2015 Microsoft