안녕하세요. 이동규(LiveDK)입니다.

이번 포스팅에서는 이름하여 Tombstoning, Windows Phone 에서 실행중인 어플리케이션이 빠져 나왔을경우(Deactivation) 그리고 다시 진입할 경우(Reactivation) 이전 상태의 보존에 대해서 알아보려고 합니다.

어플리케이션은 한번에 한번만 인터럽트 될 수 있습니다. 예를 들어 어플리케이션 실행중에 전화가 오거나 Start, Search 버튼을 눌렀을경우 'tombstoned'상태가 됩니다. 또한 통화가 끝나거나 다시 Back 버튼으로 어플리케이션으로 돌아가면 'reactivated'상태로 바뀝니다.

Tombstoned 상태일동안 어플리케이션의 메모리는 Unloaded 됩니다. 하지만 운영체제에서는 폰의 화면 상태들을 임시로 보관하게 됩니다. 폰이 다시 reactivated 상태로 돌아오면 마지막에 나왔던 화면이 보여지게 됩니다. 하지만 단순히 화면 외에 다른 모든것들(데이터 포함)은 직접 해줘야 합니다. 예제를 통해 어떻게 마지막 상태를 보존하고 다시 돌아올경우 복원하는지에 대해서 알아 보겠습니다.

예제
어플리케이션내에 버튼을 클릭했을때 클릭 횟수를 카운트 하여 페이지 타이틀에 숫자를 뿌려줍니다. 이후 Start 버튼을 눌러 Tombstoned 상태를 만든후 Back 버튼을 눌러 Reactivated 상태로 전환하여 타이틀 숫자를 복원합니다.

그림1. 예제 디자인 모습

그림1 과 같이 디자인(타이틀명 변경, 버튼추가)을 완성한 후 코드-비하인드에서 코드1과 같이 작업해줍니다. 생성자에서 UpdateCount 메서드를 호출하며 버튼을 클릭했을경우에도 메서드를 호출합니다.

int count = 0;

// Constructor

public MainPage()

{

    InitializeComponent();

    UpdateCount(count);

}

 

private void UpdateCount(int count)

{

    textBlockTitle.Text = "Count: " + count;

}

 

private void buttonCount_Click(object sender, RoutedEventArgs e)

{

    UpdateCount(++count);

}

코드1. UpdateCount 추가

이와 같이 작성후 프로그램을 실행하여 버튼을 클릭해보면 카운터가 증가하는 모습을 볼 수 있으며 Start 버튼을 눌러 빠져나온후 Back 버튼으로 뒤로가게되면 "Resuming..." 화면과 함께 복원되는것을 볼 수 있습니다. 하지만 카운터의 숫자는 다시 0으로 초기화 되버렸습니다. 그림2 참고

그림2. 실패한 Tombstoning 복원

이제 성공적인 Tombstoning을 위해 코드를 추가해 보겠습니다. 핵심적인 이벤트 두가지가 필요 합니다.
OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)
첫번째 이벤트의 경우는 이전 포스팅(Windows Phone - #6 Passing Parameters)에서 한번 사용해 보았었습니다. 첫번째 이벤트는 현재의 페이지로 화면이 넘어올때 발생하며 두번째 이벤트는 현재 페이지를 떠날때 발생합니다.

OnNavigatedTo 에서는 값을 얻어오고,
OnNavigatedFrom 에서는 값을 저장하면 될 것입니다.

 

int count = 0;

PhoneApplicationService pService = PhoneApplicationService.Current;

// Constructor

public MainPage()

{

    InitializeComponent();

    UpdateCount(count);

}

 

private void UpdateCount(int count)

{

    textBlockTitle.Text = "Count: " + count;

}

 

private void buttonCount_Click(object sender, RoutedEventArgs e)

{

    UpdateCount(++count);

}

 

//떠날 값을 저장

protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e)

{

    pService.State["count"] = count;

    base.OnNavigatedFrom(e);

}

 

//들어올 로드

protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)

{

    //count 키가 존재할때

    if (pService.State.ContainsKey("count"))

    {

        count = (int)pService.State["count"];

        UpdateCount(count);

    }

    base.OnNavigatedTo(e);
}

코드2. 전체 코드 작성

다시한번 어플리케이션을 실행하여 예제처럼 테스트 해보면 Tombstoned 상태에서 Reactivated 상태로 돌아와도 Count 값을 유지하는것을 볼 수 있습니다. 핵심적인 코드는 바로 PhoneApplicationService 에 있습니다.
PhoneApplicationService 클래스는 Microsoft.Phone.Shell 네임스페이스에 있으며 어플리케이션이 idle 상태 및 active 혹은 inactive 상태를 관리합니다.

참고자료
Programming Windows Phone 7 by Charles Petzold - http://www.charlespetzold.com/phone/
Windows Phone 7 Design Tips: Navigation, Tombstoning, and Data Loading - http://bit.ly/hXv7DB
MSDN - How to: Preserve and Restore Page State for Windows Phone - http://bit.ly/gOAPdu
MSDN - PhoneApplicationService Class - http://bit.ly/iamLFb
Posted by Dongkyu
,