내보내기(0) 인쇄
모두 확장

방법: Windows Phone의 응용프로그램 상태 유지 및 복원

2012-02-09

Windows Phone 실행 모델에서는 한 번에 하나의 응용프로그램만 포그라운드에서 실행할 수 있습니다. 사용자가 응용프로그램을 벗어난 부분을 탐색하면 일반적으로 응용프로그램이 유휴 상태로 전환됩니다. 유휴 상태에서는 응용프로그램의 코드가 더 이상 실행되지 않지만 응용프로그램이 메모리에 유지됩니다. 사용자가 뒤로 버튼을 눌러 유휴 응용프로그램으로 돌아가면 응용프로그램 실행이 계속되고 상태가 자동으로 복원됩니다. 하지만 사용자가 응용프로그램을 벗어난 부분을 탐색한 후 응용프로그램이 삭제 표식을 지정할 수도 있습니다. 사용자가 삭제 표식을 지정한 응용프로그램으로 다시 이동하는 경우 응용프로그램이 더 이상 메모리에 없기 때문에 해당 상태를 복원해야 합니다. PhoneApplicationService 클래스는 응용프로그램 상태를 유지하는 데 유용한 네 가지 이벤트(Launching, Activated, DeactivatedClosing)를 제공합니다. 응용프로그램은 이 이벤트를 통해 여러 응용프로그램 페이지에서 사용되는 전역 응용프로그램 데이터를 복원할 수 있습니다. 이러한 데이터 형식의 예로 인증 키나 웹 서비스 쿼리 결과가 있습니다. 이 항목에서는 이 이벤트를 사용하여 응용프로그램 상태를 저장하고 복원하는 패턴을 보여 줍니다. 응용프로그램 삭제 표식에 대한 자세한 내용은 Windows Phone의 실행 모델을 참조하십시오.

휴대폰 응용프로그램은 대체로 웹 서비스 등의 네트워크 리소스에서 얻은 데이터를 사용합니다. 네트워크에서 얻은 이 데이터는 응용프로그램 내의 여러 페이지에서 사용되는 경우가 많습니다. 이 데이터는 응용프로그램 상태의 일부로 간주될 수 있습니다. 응용프로그램을 비활성화한 후 다시 활성화하면 응용프로그램이 데이터를 단말기에 저장하지 않은 경우 이 데이터가 손실됩니다. 응용프로그램이 네트워크 리소스에 다른 쿼리를 실행하여 데이터를 다시 가져올 수도 있지만 응용프로그램을 비활성화할 때 상태 데이터를 저장하고 응용프로그램을 다시 활성화할 때 복원할 수 있는 두 가지 방법이 있습니다. 첫 번째 방법은 영구적 저장소를 사용하는 것입니다. 여기에는 격리된 저장소와 로컬 데이터베이스가 포함됩니다. PhoneApplicationServiceState 사전은 응용프로그램에 삭제 표식이 지정된 동안에만 지속되는 임시 저장소 위치이며 영구적 저장소보다 훨씬 빨리 액세스할 수 있습니다. 이러한 두 저장 공간 유형을 올바르게 사용하면 사용자 환경과 응용프로그램 로드 시간에 큰 영향을 줍니다.

중요중요:

State 사전에 저장하는 데이터는 직접 또는 데이터 계약을 사용하여 직렬화될 수 있어야 합니다. 자세한 내용은 데이터 계약 사용을 참조하십시오.

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

이 항목에서는 응용프로그램 상태 관리 구현을 두 부분으로 나눠서 보여 줍니다. 먼저 기본 응용프로그램 클래스를 수정하여 응용프로그램 상태 이벤트를 처리합니다. 그런 다음 유지된 응용프로그램 상태를 사용하는 PhoneApplicationPage 개체의 구현에 대해 설명합니다.

이 단원에서는 예제 응용프로그램을 구현하기 위해 기본 응용프로그램 클래스에 대해 수행해야 하는 변경 작업을 보여 줍니다.

응용프로그램 클래스를 수정하려면

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

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

    using System.Threading;
    using System.IO;
    using System.IO.IsolatedStorage;
    
    
  3. 다음 코드는 응용프로그램 데이터에 액세스할 때 사용할 public 속성 ApplicationDataObject(이 예제에서는 단순 문자열 개체)를 만듭니다. 이 속성은 private 변수 _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용 Silverlight 프로젝트 템플릿에 포함된 App.xaml.cs에 있습니다. 사용자가 휴대폰의 응용프로그램 목록에서 응용프로그램 아이콘을 클릭하는 등의 방법으로 응용프로그램을 처음 시작하면 Launching 이벤트가 발생합니다. 이 예제에서는 이 이벤트 처리기를 비워 두고 코드의 다른 위치에서 응용프로그램 상태 로드를 처리합니다. 응용프로그램이 이 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 속성을 사용하면 응용프로그램이 유휴 상태에서 돌아오는 중인지 또는 삭제 표식이 지정되었는지 확인할 수 있습니다. 이 속성은 주로 페이지 수준 Silverlight 이벤트를 받지 않는 XNA Framework 응용프로그램에 유용합니다. 이 예제에서 ApplicationInstancePreserved가 true이면 응용프로그램이 유휴 상태이며 상태가 자동으로 유지되었음을 의미하므로 ApplicationDataStatus 속성이 업데이트되고 처리기가 종료됩니다. 처리기가 State 사전에서 응용프로그램 데이터를 사용할 수 있는지 확인합니다. 사용 가능한 경우 응용프로그램이 삭제 표식을 지정했으며 Deactivated 이벤트 중에 상태를 여기에 저장했음을 의미하므로 ApplicationDataObjectState 사전에서 채워지고 데이터 상태 속성이 업데이트됩니다. 기존 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 사전과 격리된 저장소 또는 데이터베이스 저장 공간에 응용프로그램 상태를 저장해야 합니다. 이 예제 응용프로그램은 State 및 IsolatedStorage에 ApplicationDataObject를 저장합니다. SaveDataToIsolatedStorage 메서드는 이 항목의 뒷부분에서 정의되는 도우미 메서드입니다. 모든 응용프로그램 이벤트와 마찬가지로 이 처리기를 완료하는 데 10초 이상 걸리면 응용프로그램이 종료됩니다. 이 때문에 응용프로그램 수명 동안 상태를 증분 방식으로 저장하는 것이 좋습니다. 이 이벤트는 저장되지 않은 데이터를 저장할 수 있는 최종 기회일 뿐입니다. App.xaml.cs의 기존 Deactivated 처리기 위에 다음 코드를 붙여 넣습니다.

    // 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 메서드를 호출할 수 있도록 이 메서드를 public으로 정의합니다. 이 메서드는 새 스레드를 만들고 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에서 시작된 웹 요청의 결과를 처리합니다. 이 메서드는 응답 스트림에서 데이터를 읽습니다. 읽기에 성공하면 등록된 모든 페이지에 대해 ApplicationDataObjectChanged 이벤트를 발생시키는 ApplicationDataObject 변수에 데이터를 저장합니다. 또한 데이터가 웹에서 검색되었음을 나타내도록 상태 변수를 설정합니다. 웹 요청이 실패한 경우에도 상태가 업데이트됩니다.

    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;
    }
    
    

이 단원에서는 예제 응용프로그램을 구현하기 위해 기본 Page 클래스에 대해 수행해야 하는 변경 작업을 보여 줍니다.

Page 클래스를 수정하려면

  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 7.5 에서는 사용자가 응용프로그램을 벗어난 부분을 탐색할 경우 포그라운드 응용프로그램을 원활하게 실행할 수 있는 메모리가 충분하기만 하면 응용프로그램이 유휴 상태로 전환됩니다. 응용프로그램을 유휴 상태로 전환한 후 복원하면 UI 상태가 자동으로 유지됩니다. 중단 후에 페이지 상태가 제대로 복원되는지 확인하려면 디버거에서 자동 중단을 사용하도록 설정해야 합니다.

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

삭제 표식을 사용하도록 설정한 후 F5 키를 눌러 응용프로그램 디버깅을 시작합니다. 응용프로그램이 처음 로드될 때는 격리된 저장소나 응용프로그램의 State 사전에 상태 데이터가 없으므로 데이터가 표시되고 데이터가 웹에서 검색되었다고 상태 필드에 표시됩니다. 시작 버튼을 탭하여 응용프로그램을 비활성화하고 뒤로 버튼을 눌러 다시 활성화하면 데이터가 응용프로그램 State 사전에서 검색됩니다. 이제 뒤로 버튼을 다시 눌러 응용프로그램을 종료한 후 응용프로그램을 다시 시작합니다. 30초 내에 응용프로그램을 시작하면 격리된 저장소에서 데이터가 검색됩니다.

참고참고:

XNA Framework 응용프로그램의 경우 디버깅하는 동안 비활성화 시 삭제 표식 확인란이 프로젝트 속성 대화 상자의 XNA Game Studio 탭에 있습니다.

표시:
© 2015 Microsoft