본문 바로가기
Programming/Windows Phone

윈도우 폰 실행모델 모범사례

by 강철 벼룩 2012. 1. 4.


윈도우 폰 애플리케이션은 사용자가 해당 애플리케이션을 벗어날 때 잠재적으로 종료된다. 다음 주제는 실행 모델 이벤트를 처리하는 몇 가지 모범 사례다.

▩ 13 가지 모범 사례

1. [시작] 이나 설치된 애플리케이션 목록에서 사용자가 애플리케이션을 실행시킬때, 해당 사용자는 일관된 실행 경험을 얻어야 한다. 새로운 애플리케이션 인스턴스의 경험은 사용자에게 명확하게 와 닿아야 한다.

새로운 애플리케이션 인스턴스를 시작할 때, 이 인스턴스는 예를 들면 최근에 열었던 문서의 목록 처럼 이전 인스턴스에 관한 정보를 사용자에게 나타내야 하지만, 사용자는 이전 세션을 계속 유지하고 있다는 느낌은 받지 않아야 한다.

2. 사용자가 이전에 실행한 애플리케이션으로 돌아가 애플리케이션을 활성화 할 때, 사용자는 해당 애플리케이션이 비활성화 되었을 때 보여준 형태와 일관된 경험을 가져야 한다. 애플리케이션이 종료되고 재시작된 것이 사용자에게 구분되어야 한다.

3. 몇몇 윈도우 폰 기능은 실행된 애플리케이션에 상황별 정보를 전달하는 방식으로 해당 애플리케이션을 시작하는 메커니즘을 사용자에게 제공한다. 예를 들면  ShellToast와 Reminder, ShellTile 모두는 전달될 수 있는 쿼리 문자열에 NavigationUri 파라미터를 노출하고 MediaHistoryItem 클래스는 상황별 정보를 전달할 수 있는  PlayerContext 속성을 갖는다. 해당 애플리케이션은 이들 메커니즘 중 하나를 사용해 시작할 때 컨텍스트에 적절한 콘텐츠를 표시해야 한다.

4. PhoneApplicationService 클래스의 State 속성을 사용해  Deactivated 이벤트 핸들러의 일시적인 애플리케이션 상태를 저장하고  Activated 핸들러의 애플리케이션 상태를 가져온다.

5. PhoneApplicationPage 클래스의  State 속성을 사용해 OnNavigatedFrom 이벤트 핸들러의 일시적인 페이지 상태를 저장하고  OnNavigatedTo 이벤트 핸들러의 페이지 상태를 가져온다.

6. 애플리케이션이 삭제 표시된 후, 사용자는 해당 애플리케이션으로 돌아오지 않을 것이다. 이런 이유로 Deactivated 이벤트 핸들러와  Closing 이벤트 핸들러 둘 다에서 별도의 저장소에 지속적인 상태를 저장해야 한다. 코드의 중복을 피하기 위해 별도의 저장소에 항구적인 데이터를 저장하고 양쪽 이벤트 핸들러에서 동일한 메서드를 호출하는 하나의 메서드를 생성할 수 있다.

7. 애플리케이션은  Activated와 Deactivated, 10초 이하의 OnNavigatedTo와 OnNavigatedFrom과 같은 페이지 탐색 메서드 등의 모든 애플리케이션 이벤트 핸들러를 완료해야 한다. 애플리케이션에서 이들 이벤트를 완료하는데 10초 이상 걸린다면, 해당 애플리케이션은 종료된다.

8. 애플리케이션이 별도 저장소의 데이터에 의존한다면, 이벤트 핸들러 시작이나 Activated 이벤트 핸들러에서 이 데이터를 로드하지 않아야 한다.디스크 작업은  수 초가 걸릴 것이고 이들 이벤트는 애플리케이션이 로드되고 활성화되기 전에 호출되므로, 이들 핸들러에서 별도 저장소에 접근하는 것은 애플리케이션 로드하는데 시간이 많이 걸리게 만든다. 대신에 애플리케이션 로드가 끝난후 비동기로 별도 저장소를 로드해야 한다.

Deactivated와 Closing 이벤트 핸들러에서 별도 저장소에 데이터를 작성해야할 수 있지만, 이들 이벤트 핸들러가 완료하는데 허용되는 시간이 최대 10초이므로, 애플리케이션이 이들 이벤트 동안 저장해야 하는 데이터의 양을 최소화하도록 실행하는 동안 점진적으로 저장하는 것을 권장한다.

9. 애플리케이션은 휴면 상태로 저장되고 삭제 표시되지 않고 실행 상태로 반환될 수 있다. 애플리케이션이 비활성화 될 때 애플리케이션의 메모리 내 상태를 소멸시키지 않는지 확인하자.

10. 시작 관리자(Launcher) 나 선택자(Chooser) 호출은 항상 애플리케이션을 비활성화하고 애플리케이션이 삭제 표시되게 할 것이다. 애플리케이션이 다시 활성화될 때 애플리케이션에서 선택자 작업의 결과를 받는다는 것을 보장하기 위해 해당 선택자 개체는 PhoneApplicationPage 클래스 내에서 전역으로 선언되어야 하고 선택자를 초기화하고PhoneApplicationPage  생성자에서 Completed 이벤트 대리자를 할당해야 한다.

11. PhoneApplicationService  이벤트에 대한 핸들러는 Windows Phone SDK로 포함된 기본 윈도우 폰 애플리케이션 프로젝트 템플릿에서 스텁으로 나온다. 이들은 App.xaml.cs에서 찾을 수 있다.

12. PhoneApplicationService 클래스의 인스턴스는 윈도우 폰 애플리케이션 프로젝트 템플릿이 제공한다. 다음 코드를 사용해 애플리케이션에서 이 클래스의 State 사전을 접근하자.

private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
    PhoneApplicationService.Current.State["key"] = "value";
}

13. State 사전에 저장하는 모든 데이터는 데이터 계약을 사용하거나 직접적으로 직렬화가능해야 한다.

※ 개별 폰 기능에 대한 실행 모델 고려사항

푸시 알림
애플리케이션이 시작될 때 마다, 해당 애플리케이션이 이전에  삭제 되었다는 표시에 상관없이, 애플리케이션은 해당 알림 채널이 더 이상 유효하지 않으며 재성성되어야 함을 가정한다. 알림 채널 생성에 대한 더 자세한 정보는 "윈도우 폰 애플리케이션에서 푸시 알림을 수신하는 방법"을 살펴보자.