이 페이지가 유용했습니까?
이 콘텐츠에 대한 여러분의 의견은 중요합니다. 의견을 알려주십시오.
추가 의견
1500자 남음
내보내기(0) 인쇄
모두 확장
정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 앱 상태를 유지 및 복원하는 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

Windows Phone 실행 모델에서는 한 번에 한 앱만 포그라운드에서 실행할 수 있습니다. 사용자가 앱 외부로 이동하면 앱은 일반적으로 유휴 상태가 됩니다. 유휴 상태에서는 앱 코드가 더 이상 실행되지 않지만 앱은 메모리 내에 유지됩니다. 사용자가 뒤로 버튼을 눌러 유휴 상태인 앱으로 돌아오면 앱 실행이 계속되고 상태가 자동으로 복원됩니다. 그러나 사용자가 외부로 이동한 후 앱을 삭제 표시할 수 있습니다. 사용자가 삭제 표시된 앱으로 다시 이동하면 앱이 더 이상 메모리 내에 있지 않으므로 자체적으로 상태를 복원해야 합니다. PhoneApplicationService 클래스는 앱 상태를 유지 및 관리하는 데 사용할 수 있는 네 가지 이벤트, 즉 Launching, Activated, DeactivatedClosing을 제공합니다. 이러한 이벤트를 사용하면 앱이 여러 앱 페이지에 사용되는 전역 앱 데이터를 복원할 수 있습니다. 이러한 데이터 형식의 예로는 인증 키 또는 웹 서비스 쿼리의 결과 등이 있습니다. 이 항목에서는 이러한 이벤트를 사용하여 앱 상태를 저장 및 복원하는 패턴을 설명합니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

휴대폰 앱은 일반적으로 웹 서비스 등의 네트워크 리소스에서 가져온 데이터를 사용합니다. 앱 내의 여러 페이지가 네트워크에서 이 데이터를 사용하는 경우가 많습니다. 이 데이터는 앱 상태의 일부로 간주할 수 있습니다. 앱을 비활성화했다가 다시 활성화하는 경우 앱이 이 데이터를 장치에 저장하지 않았다면 데이터가 손실됩니다. 이때 앱은 네트워크 리소스에 대한 다른 쿼리를 수행하는 것만으로 데이터를 다시 가져올 수도 있지만 앱을 비활성화할 때 상태 데이터를 저장하고, 앱을 다시 활성화할 때 해당 데이터를 복원하는 두 가지 방법도 있습니다. 첫 번째 방법은 영구 저장소를 사용하는 것입니다. 여기에는 격리된 저장소와 로컬 데이터베이스가 포함됩니다. PhoneApplicationServiceState 사전은 앱이 삭제 표시된 경우에만 유지되는 임시 저장 위치이지만 영구 저장소에 비해 훨씬 빠르게 액세스할 수 있습니다. 이러한 두 가지 저장소 유형을 적절하게 활용하면 사용자 환경과 앱 로드 시간이 크게 향상됩니다.

중요중요:

State 사전에 저장하는 모든 데이터는 직접 또는 데이터 계약을 통해 직렬화할 수 있어야 합니다. 자세한 내용은 데이터 계약 사용을 참조하세요.

이 항목에서는 웹의 데이터를 표시하는 앱을 만드는 과정을 안내합니다. 앱을 삭제 표시하고 종료하면 앱을 실행, 비활성화하고 삭제 표시하거나 다시 활성화할 때 이 데이터가 유지, 복원 및 검색됩니다. 시간이 많이 걸리는 모든 데이터 작업은 비동기 방식으로 수행되므로 앱 사용자 인터페이스는 계속 응답합니다. 이 예제에서 사용되는 앱 상태 데이터는 웹 사이트에서 가져오며, 페이지의 TextBlock에 표시되는 간단한 데이터 문자열입니다. 실제 앱에서는 일반적으로 보다 구조적인 데이터와 더 복잡한 사용자 인터페이스를 사용하지만 기본적인 개념은 동일합니다.

이 항목에서는 앱 상태 관리 구현 기능을 두 부분으로 나누어 안내합니다. 먼저 앱 상태 이벤트를 처리하도록 기본 응용프로그램 클래스를 수정합니다. 다음으로, 유지된 앱 상태를 사용하는 PhoneApplicationPage 개체의 구현에 대해 설명합니다.

이 섹션에서는 샘플 앱을 구현하기 위해 기본 응용프로그램 클래스에서 수행해야 하는 변경 사항을 안내합니다.

런타임 클래스를 수정하려면

  1. Visual Studio 에서 새 Windows Phone 앱  프로젝트를 만듭니다. 이 템플릿은 Windows Phone 카테고리에 있습니다.

  2. 이 섹션의 모든 단계에서 모든 Windows Phone 프로젝트 템플릿에 포함된 App.xaml.cs 파일을 수정합니다. 먼저 파일 맨 위에 다음 using 지시문을 추가합니다.

    using System.Threading;
    using System.IO;
    using System.IO.IsolatedStorage;
    
    
  3. 다음 코드는 앱 데이터에 액세스하는 데 사용되는 공용 속성인 ApplicationDataObject(이 예제에서는 간단한 문자열 개체임)를 만듭니다. 이 속성은 전용 변수인 _applicationDataObject를 사용해 데이터를 저장합니다. 앱 데이터가 변경되어 해당 상태가 다시 설정될 때마다 앱 내의 페이지에서 이벤트를 받을 수 있도록 ApplicationDataObjectChanged 이벤트 및 OnApplicationDataObjectChanged가 만들어집니다. 다음 코드를 App.xaml.cs의 App 클래스 정의 내에 붙여 넣습니다.

    // Declare a private variable to store application state.
    private string _applicationDataObject;
    
    // Declare an event for when the application data changes.
    public event EventHandler ApplicationDataObjectChanged;
    
    // Declare a public property to access the application data variable.
    public string ApplicationDataObject
    {
      get { return _applicationDataObject; }
      set
      {
        if (value != _applicationDataObject)
        {
          _applicationDataObject = value;
          OnApplicationDataObjectChanged(EventArgs.Empty);
        }
      }
    }
            
    // Create a method to raise the ApplicationDataObjectChanged event.
    protected void OnApplicationDataObjectChanged(EventArgs e)
    {
      EventHandler handler = ApplicationDataObjectChanged;
      if (handler != null)
      {
        handler(this, e);
      }
    }
    
    
  4. 이 예제에서는 ApplicationDataObject 속성을 사용해 앱 데이터를 페이지에 노출합니다. 별도의 속성인 ApplicationDataStatus를 사용하여 앱 데이터의 원본(웹, 격리된 저장소 또는 앱 State 사전에서 가져옴)을 노출합니다. 이전 단계에 나와 있는 코드 아래에 다음 속성 정의를 붙여 넣습니다.

    // Declare a public property to store the status of the application data.
    public string ApplicationDataStatus { get; set; }
    
    
  5. 이제 앱 이벤트 처리기를 구현합니다. 이러한 이벤트 처리기의 스텁은 모든 Windows Phone 프로젝트 템플릿의 App.xaml.cs에서 제공됩니다. Launching 이벤트는 사용자가 휴대폰 앱 목록에서 앱 아이콘을 클릭하는 등의 방법으로 앱을 처음 실행할 때 발생합니다. 이 예제에서는 이 이벤트 처리기를 비워 두고, 코드의 다른 위치에서 앱 상태 로드를 처리합니다. 이 이벤트 처리기에서 코드가 실행되면 앱 초기 시작이 지연됩니다. 따라서 이 이벤트 처리기에서는 시간이 많이 걸리는 리소스 액세스를 시도하지 않아야 합니다. 여기에는 격리된 저장소나 데이터베이스 저장소에 액세스하는 경우 또는 웹 서비스에 액세스하려는 시도가 포함됩니다. 모든 앱 이벤트의 완료 제한 시간은 10초입니다. 앱에서 이러한 이벤트 제한을 초과하는 경우 앱이 즉시 종료됩니다.

    // Code to execute when the application is launching (for example, from Start)
    // This code will not execute when the application is reactivated.
    private void Application_Launching(object sender, LaunchingEventArgs e)
    {
    }
    
    
  6. 앱이 유휴 상태이거나 삭제 표시된 상태에서 사용자가 앱으로 다시 이동하면 Activated 이벤트가 발생합니다. Launching 이벤트와 마찬가지로 이 이벤트에서 코드가 실행되면 앱을 다시 시작하는 데 시간이 지연됩니다. 따라서 이 처리기에서는 격리된 저장소 또는 데이터베이스 저장소에 액세스하거나 동기 웹 요청을 실행하지 마세요. ActivatedEventArgsIsApplicationInstancePreserved 속성을 사용하면 앱이 유휴 상태에서 정상 상태로 돌아오는지, 아니면 삭제 표시되었는지를 확인할 수 있습니다. 이 속성은 주로 페이지 수준 이벤트를 받지 않는 XNA Framework 앱에서 사용됩니다. 이 예제에서는 ApplicationInstancePreserved가 true이면 앱이 유휴 상태여서 해당 상태가 자동으로 유지된 것이므로, ApplicationDataStatus 속성이 업데이트되고 처리기가 종료됩니다. 다음으로, 처리기는 앱 데이터를 State 사전에서 사용할 수 있는지 확인합니다. 사전을 사용할 수 있는 경우 앱이 삭제 표시되었으며 Deactivated 이벤트 동안 여기에 상태를 저장한 것이므로, State 사전에서 ApplicationDataObject가 채워지고 데이터 상태 속성이 업데이트됩니다. 기존 Application_Activated 처리기를 다음 코드로 바꾸세요.

    // Code to execute when the application is activated (brought to the foreground)
    // This code will not execute when the application is first launched.
    private void Application_Activated(object sender, ActivatedEventArgs e)
    {
      if (e.IsApplicationInstancePreserved)
      {
        ApplicationDataStatus = "application instance preserved.";
        return;
      }
    
      // Check to see if the key for the application state data is in the State dictionary.
      if (PhoneApplicationService.Current.State.ContainsKey("ApplicationDataObject"))
      {
        // If it exists, assign the data to the application member variable.
        ApplicationDataStatus = "data from preserved state.";
        ApplicationDataObject = PhoneApplicationService.Current.State["ApplicationDataObject"] as string;
      }
    }
    
    
  7. Deactivated 이벤트는 사용자가 앱 외부로 전방 탐색할 때마다 호출됩니다. 앱은 보통 비활성화될 때 유휴 상태가 됩니다. 그러나 이 시점에는 앱이 이 이벤트 이후에 삭제 표시되는지, 종료되는지를 확인할 방법이 없습니다. 따라서 앱 상태를 State 사전과 격리된 저장소 또는 데이터베이스 저장소에 저장해야 합니다. 이 예제 앱은 ApplicationDataObjectState 및 IsolatedStorage에 저장합니다. 이 항목 뒷부분에서 도우미 메서드인 SaveDataToIsolatedStorage 메서드를 정의합니다. 모든 앱 이벤트와 마찬가지로, 이 처리기를 완료하는 데 시간이 10초 넘게 걸리면 앱이 종료됩니다. 따라서 앱 수명 주기 전체에서 상태를 증분으로 저장하는 것이 좋습니다. 이 이벤트 이후에는 저장되지 않은 데이터를 저장할 수 없습니다. 다음 코드를 App.xaml.cs의 기존 App 처리기 위에 붙여 넣습니다.

    // Code to execute when the application is deactivated (sent to background)
    // This code will not execute when the application is closing.
    private void Application_Deactivated(object sender, DeactivatedEventArgs e)
    {
      // If there is data in the application member variable...
      if (!string.IsNullOrEmpty(ApplicationDataObject))
      {
        // Store it in the State dictionary.
        PhoneApplicationService.Current.State["ApplicationDataObject"] = ApplicationDataObject;
    
        // Also store it in isolated storage, in case the application is never reactivated.
        SaveDataToIsolatedStorage("myDataFile.txt", ApplicationDataObject);
      }
    }
    
    
  8. 사용자가 뒤로 버튼을 사용하여 앱 첫 페이지를 지나 뒤로 탐색하면 Closing 이벤트가 발생합니다. 이 이벤트 이후에는 앱이 종료됩니다. 사용자가 앱으로 돌아오려면 앱을 다시 실행해야 합니다. 따라서 모든 상태 데이터를 격리된 저장소에 저장해야 합니다. State 사전에는 상태 데이터를 저장할 필요가 없습니다. 여기서도 이 이벤트를 완료하는 데 시간이 10초 넘게 걸리면 앱이 즉시 종료되므로, 앱 수명 주기 전체에서 상태를 증분 저장하는 것이 좋습니다. 다음 코드를 App.xaml.cs의 기존 Closing 처리기 위에 붙여 넣습니다.

    // Code to execute when the application is closing (for example, the user pressed the Back button)
    // This code will not execute when the application is deactivated.
    private void Application_Closing(object sender, ClosingEventArgs e)
    {
      // The application will not be tombstoned, so save only to isolated storage.
      if (!string.IsNullOrEmpty(ApplicationDataObject))
      {
        SaveDataToIsolatedStorage("myDataFile.txt", ApplicationDataObject);
      }
    }
    
  9. 이제 전역 앱 데이터를 가져오기 위해 도우미 메서드를 만듭니다. 이 코드를 앱 클래스에 추가하면 앱의 각 페이지에서 클래스를 구현하지 않아도 됩니다. 먼저 GetDataAsync 메서드를 앱 페이지에서 호출할 수 있도록 공용으로 정의합니다. 이 메서드는 새 스레드를 만들고 GetData 도우미 메서드를 호출합니다. 앱의 사용자 인터페이스가 계속 응답하도록 시간이 많이 소요되는 작업은 항상 비동기로 수행해야 합니다.

    이 예제에서는 격리된 저장소에 저장된 타임스탬프를 사용하여 앱 데이터를 마지막으로 저장한 시간을 기록합니다. GetData 도우미 메서드는 이 타임스탬프를 확인한 다음, 데이터를 저장한 시간이 30초 이내이면 격리된 저장소에서 앱 데이터를 로드하여 ApplicationDataObject 속성에 저장합니다. 이전에는 ApplicationDataObject가 변경되면 수신 대상 페이지가 이벤트를 수신하도록 ApplicationDataObjectChanged 이벤트가 만들어졌습니다. 또한 데이터가 격리된 저장소에서 검색되었다는 사실을 페이지에 표시할 수 있도록 ApplicationDataStatus 필드가 업데이트됩니다.

    타임스탬프가 격리된 저장소의 데이터가 30초보다 오래되었음을 나타내는 경우 앱이 웹에서 새 데이터를 검색합니다. 이 예제에서는 HttpWebRequest를 사용하여 요청을 시작합니다. 다음 단계에서는 HandleWebResponse 도우미 메서드가 표시됩니다.

    public void GetDataAsync()
    {
      // Call the GetData method on a new thread.
      Thread t = new Thread(new ThreadStart(GetData));
      t.Start();
    }
    
    private void GetData()
    {
      // Check the time elapsed since data was last saved to isolated storage.
      TimeSpan TimeSinceLastSave = TimeSpan.FromSeconds(0);
      if (IsolatedStorageSettings.ApplicationSettings.Contains("DataLastSavedTime"))
      {
        DateTime dataLastSaveTime = (DateTime)IsolatedStorageSettings.ApplicationSettings["DataLastSavedTime"];
        TimeSinceLastSave = DateTime.Now - dataLastSaveTime;
      }
    
      // Check to see if data exists in isolated storage and see if the data is fresh.
      // This example uses 30 seconds as the valid time window to make it easy to test. 
      // Real apps will use a larger window.
      IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
      if (isoStore.FileExists("myDataFile.txt") && TimeSinceLastSave.TotalSeconds < 30)
      {
        // This method loads the data from isolated storage, if it is available.
        StreamReader sr = new StreamReader(isoStore.OpenFile("myDataFile.txt", FileMode.Open));
        string data = sr.ReadToEnd();
        sr.Close();
    
        ApplicationDataStatus = "data from isolated storage";
        ApplicationDataObject = data;
      }
      else
      {
        // Otherwise, it gets the data from the web. 
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(new Uri("http://windowsteamblog.com/windows_phone/b/windowsphone/rss.aspx"));
        request.BeginGetResponse(HandleWebResponse, request);
      }
    }
    
    
  10. HandleWebResponse 도우미 메서드를 사용하여 GetData에서 시작된 웹 요청의 결과를 처리합니다. 이 메서드는 응답 스트림에서 데이터 읽기를 시도합니다. 데이터를 읽을 수 있는 경우 이 메서드는 ApplicationDataObject 변수에 데이터를 저장합니다. 그러면 해당 변수에 등록된 모든 페이지에 ApplicationDataObjectChanged 이벤트가 발생합니다. 또한 데이터를 웹에서 검색했음을 나타내는 상태 변수도 설정됩니다. 웹 요청이 실패하면 상태도 업데이트됩니다.

    private void HandleWebResponse(IAsyncResult result)
    {
      // Put this in a try block in case the web request was unsuccessful.
      try
      {
        // Get the request from the IAsyncResult.
        HttpWebRequest request = (HttpWebRequest)(result.AsyncState);
    
        // Read the response stream from the response.
        StreamReader sr = new StreamReader(request.EndGetResponse(result).GetResponseStream());
        string data = sr.ReadToEnd();
    
        // Use the Dispatcher to call SetData on the UI thread, passing the retrieved data.
        //Dispatcher.BeginInvoke(() => { SetData(data, "web"); });
        ApplicationDataStatus = "data from web.";
        ApplicationDataObject = data;
      }
      catch
      {
        // If the data request fails, alert the user.
        ApplicationDataStatus = "Unable to get data from Web.";
        ApplicationDataObject = “”;
      }
    }
    
    
  11. App.xaml.cs에서 구현할 마지막 도우미 메서드는 SaveDataToIsolatedStorage입니다. 이 메서드는 DeactivatedClosing 이벤트 처리기에서 호출됩니다. 또한 단순히 제공된 값을 지정한 파일에 저장하고 GetData에서 확인한 타임스탬프를 다시 설정합니다.

    private void SaveDataToIsolatedStorage(string isoFileName, string value)
    {
      IsolatedStorageFile isoStore = IsolatedStorageFile.GetUserStoreForApplication();
      StreamWriter sw = new StreamWriter(isoStore.OpenFile(isoFileName, FileMode.OpenOrCreate));
      sw.Write(value);
      sw.Close();
      IsolatedStorageSettings.ApplicationSettings["DataLastSaveTime"] = DateTime.Now;
    }
    
    

이 섹션에서는 샘플 앱을 구현하기 위해 기본 페이지 클래스에서 수행해야 하는 변경 사항을 안내합니다.

페이지 클래스를 수정하려면

  1. 앱 상태를 관리하기 위해 앱 클래스를 수정한 후에는 각 페이지에서 상태 데이터를 사용하는 데 필요한 약간의 코드만 추가하면 됩니다. 먼저 TextBlock 컨트롤 두 개를 만듭니다. 이 컨트롤 중 하나는 앱 데이터를 표시하는 데 사용되고, 나머지 하나는 데이터를 검색한 위치를 나타내는 상태 변수를 표시하는 데 사용됩니다. 실제 앱에서는 데이터를 보다 사용하기 쉽거나 고유한 방식으로 표시하지만, 이 예제에서는 코드를 단순하게 유지하기 위해 페이지의 데이터를 텍스트로만 표시합니다.

    MainPage.xaml 파일에서 "ContentPanel"이라는 Grid 요소에 다음 XAML 코드를 삽입합니다.

    <TextBlock Height="30" HorizontalAlignment="Left" Margin="20,20,0,0" Name="statusTextBlock" Text="no status" VerticalAlignment="Top" Width="424" />
    <TextBlock HorizontalAlignment="Left" Margin="20,60,0,0" Name="dataTextBlock" Text="no data" VerticalAlignment="Top" Width="424" Foreground="{StaticResource PhoneAccentBrush}" MaxWidth="424" />
    
  2. 다음으로, 이후 단계에서 페이지가 새 인스턴스인지 확인하는 데 사용할 부울 변수 _isNewPageInstance를 추가합니다. MainPage.xaml.cs의 MainPage 클래스 정의에 다음 줄을 추가합니다.

    public partial class MainPage : PhoneApplicationPage
    {
            bool _isNewPageInstance = false;
    
    
  3. MainPage 클래스의 생성자에서 _isNewPageInstance를 true로 설정합니다. 사용자가 단순히 기존 페이지로 다시 이동하는 경우에는 생성자가 호출되지 않습니다. 이 경우 상태를 다시 로드할 필요가 없습니다. 다음으로 App.xaml.cs에서 정의된 ApplicationDataObjectChanged 이벤트 처리기를 등록합니다. 이렇게 하면 페이지에서 앱 데이터가 수정된 시간을 확인할 수 있습니다.

    // Constructor
    public MainPage()
    {
      InitializeComponent();
    
      _isNewPageInstance = true;
    
      // Set the event handler for when the application data object changes.
      (Application.Current as ExecutionModelApplication.App).ApplicationDataObjectChanged +=
                    new EventHandler(MainPage_ApplicationDataObjectChanged);
    }
    
    
  4. 사용자가 페이지로 이동할 때마다 OnNavigatedTo(NavigationEventArgs) 메서드가 호출됩니다. _isNewPageInstance 값을 확인하여 페이지가 새 페이지인지, 아니면 사용자가 이미 메모리 내에 있는 페이지로 다시 이동하는지를 파악합니다. 새 페이지인 경우 ApplicationDataObject 변수가 null이 아니면 UpdateApplicationUI 도우미 메서드를 호출합니다. 나중에 이 도우미 메서드를 정의하여 페이지 UI에서 TextBox 컨트롤을 업데이트합니다. ApplicationDataObject 변수가 null인 경우에는 데이터를 격리된 저장소나 웹에서 검색해야 합니다. 이 경우 사용자가 데이터를 검색하는 중임을 확인할 수 있도록 상태 TextBlock이 업데이트되고, App.xaml.cs에 정의된 GetDataAsync 도우미 메서드가 호출됩니다. 마지막으로 _isNewPageInstance가 false로 설정됩니다.

    다음 메서드 정의를 MainPage.xaml.cs에 붙여 넣습니다.

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
      // If _isNewPageInstance is true, the page constructor has been called, so
      // state may need to be restored.
      if (_isNewPageInstance)
      {
        // If the application member variable is not empty,
        // set the page's data object from the application member variable.
        if ((Application.Current as ExecutionModelApplication.App).ApplicationDataObject != null)
        {
          UpdateApplicationDataUI();
        }
        else
        {
          // Otherwise, call the method that loads data.
          statusTextBlock.Text = "getting data...";
          (Application.Current as ExecutionModelApplication.App).GetDataAsync();
        }
      }
    
      // Set _isNewPageInstance to false. If the user navigates back to this page
      // and it has remained in memory, this value will continue to be false.
      _isNewPageInstance = false;
    }
    
    
  5. 마지막으로 ApplicationDataObjectChanged 이벤트에 대한 이벤트 처리기를 만듭니다. 이 메서드는 단순히 UpdateApplicationDataUI를 호출하여 페이지 UI를 새 데이터로 업데이트합니다.

    // The event handler called when the ApplicationDataObject changes.
    void MainPage_ApplicationDataObjectChanged(object sender, EventArgs e)
    {
      // Call UpdateApplicationData on the UI thread.
      Dispatcher.BeginInvoke(() => UpdateApplicationDataUI());      
    }
    void UpdateApplicationDataUI()
    {
      // Set the ApplicationData and ApplicationDataStatus members of the ViewModel
      // class to update the UI.
      dataTextBlock.Text = (Application.Current as ExecutionModelApplication.App).ApplicationDataObject;
      statusTextBlock.Text = (Application.Current as ExecutionModelApplication.App).ApplicationDataStatus;
    }
    
    

Windows Phone 에서는 포그라운드 앱이 정상적으로 실행되는 데 필요한 메모리를 충분히 사용할 수 있으면 사용자가 외부로 이동할 때 앱이 유휴 상태가 됩니다. 앱이 유휴 상태가 되었다가 복원되면 UI 상태는 자동으로 유지됩니다. 페이지 상태가 삭제 표시된 이후 올바르게 복원되었는지 확인하려면 디버거에서 자동 삭제 표시를 사용하도록 설정해야 합니다.

프로젝트 메뉴에서 [응용프로그램 이름] 속성...을 선택하거나, 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하여 프로젝트 속성을 엽니다. 디버그 탭에서 레이블이 디버깅하는 동안 비활성화 시 삭제 표시인 확인란을 선택합니다.

삭제 표시를 사용하도록 설정한 후 F5 키를 눌러 앱 디버그를 시작합니다. 앱이 처음 로드될 때는 격리된 저장소나 앱의 State 사전에 상태 데이터가 없기 때문에, 데이터가 표시되고 상태 필드에 해당 데이터를 웹에서 검색했다는 메시지가 표시됩니다. 시작 버튼을 눌러 앱을 비활성화한 후에 뒤로 버튼을 눌러 앱을 다시 활성화하면 앱의 State 사전에서 데이터를 검색합니다. 이제 뒤로 버튼을 다시 눌러 앱을 종료했다가 다시 실행합니다. 30초 이내에 앱을 실행하면 격리된 저장소에서 데이터를 검색합니다.

참고참고:

XNA Framework 앱에서 디버깅하는 동안 비활성화 시 삭제 표시 확인란은 프로젝트 속성 대화 상자의 XNA Game Studio 탭에 있습니다.

표시:
© 2015 Microsoft