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

Windows Phone 8의 백그라운드 에이전트 모범 사례

2014-06-18

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

 

이 항목에는 Windows Phone 의 백그라운드 에이전트 개발에서 중요하게 고려해야 할 사항 및 모범 사례가 나와 있습니다.

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

 

다음은 백그라운드 에이전트를 디버깅할 때 고려해야 할 사항입니다.

  • 디버깅 시 LaunchForTest(String, TimeSpan)를 사용하여 백그라운드 에이전트를 실행합니다. 디버거가 연결되어 있으면 시스템에서 정기 에이전트를 실행하지 않습니다. 이 메서드는 포그라운드 앱이나 백그라운드 에이전트에서 호출할 수 있습니다.

  • Windows Phone OS 7.1 앱의 경우 디버거가 연결되어 있는 동안에는 메모리 및 실행 시간 정책이 적용되지 않습니다. 에이전트가 메모리 한도를 초과하지 않는지, 또는 해당 에이전트 유형에 허용되는 기간보다 더 길게 실행되지 않는지 확인하려면 디버깅이 수행되지 않을 때 에이전트를 테스트해야 합니다. Windows Phone 8 앱의 경우 디버깅 중에도 메모리 및 실행 시간 정책이 적용됩니다.

  • 포그라운드 앱과 백그라운드 에이전트 모두에 대해 ApplicationMemoryUsageLimit를 사용하여 메모리 제한을 쿼리합니다.

Windows Phone OS 7.1 에서 사용자는 휴대폰의 설정 앱에서 설치된 각 앱에 대해 백그라운드 에이전트를 비활성화할 수 있습니다. 앱에 대해 에이전트가 비활성화되어 있으면 ScheduledActionServiceAdd(ScheduledAction) 메서드가 InvalidOperationException을 발생시키므로 try 블록의 Add에 호출을 배치합니다. 예외가 발생되고 예외와 연관된 메시지가 "BNS 오류: 작업을 사용할 수 없습니다."인 경우 앱에 대해 에이전트가 비활성화된 것입니다. 다음 코드는 이 경우를 처리하는 적절한 방법을 보여 줍니다.

bool agentsAreEnabled = true;
PeriodicTask periodicTask = new PeriodicTask("MyPeriodicTask");
periodicTask.Description = "This demonstrates a periodic task.";

// Place the call to Add in a try block in case the user has disabled agents.
try
{
  ScheduledActionService.Add(periodicTask);
}
catch (InvalidOperationException exception)
{
  if (exception.Message.Contains("BNS Error: The action is disabled"))
  {
    MessageBox.Show("Background agents for this application have been disabled by the user.");
    agentsAreEnabled = false;
  }
  if (exception.Message.Contains("BNS Error: The maximum number of ScheduledActions of this type have already been added."))
  {
    // No user action required. The system prompts the user when the hard limit of periodic tasks has been reached.
  }
}
catch (SchedulerServiceException)
{
  // No user action required.
}

}

정기 백그라운드 에이전트의 수가 장치의 제한에 도달하면 InvalidOperationException도 발생합니다. 허용되는 에이전트 수는 장치의 하드웨어 기능에 따라 달라지지만, 값이 작으므로 이 제한에 도달하는 경우가 많습니다. 이런 이유로 정기 작업을 추가할 때 이 예외를 catch하는 것이 매우 중요합니다. 작업을 추가할 때, 이를테면 단말기가 막 부팅되었고 예약된 작업 서비스가 아직 시작하지 않았을 때 SchedulerServiceException도 발생할 수 있습니다. 예약된 작업을 추가할 때마다 이 예외를 catch해야 합니다.

팁팁:

앱의 정기 백그라운드 에이전트가 실행될 때 소량의 장치 배터리 전력을 소비합니다. 사용자는 설정 앱에서 하나 이상의 앱에 대해 백그라운드 에이전트를 사용하지 않도록 설정하여 배터리 수명을 늘릴 수 있습니다. 그러나 사용자가 더 편리하게 기능성과 배터리 수명의 균형을 조정할 수 있도록 포그라운드 앱에 기능을 추가하여 사용자의 선택적인 백그라운드 에이전트 사용을 지원하는 경우도 있습니다.

포그라운드 앱과 백그라운드 에이전트 간 정보 전달은 에이전트와 앱이 동시에 실행될지 예측할 수 없기 때문에 다소 어렵습니다. 다음은 이러한 상황에서 권장되는 패턴입니다.

  1. 정기 에이전트 및 리소스를 많이 사용하는 에이전트의 경우: Mutex에 의해 보호되는 격리된 저장소의 파일 또는 LINQ 2 SQL을 사용합니다. 포그라운드 앱이 쓰고 에이전트는 읽기만 하는 단방향 통신에서는 뮤텍스와 함께 격리된 저장소의 파일을 사용하는 것이 좋습니다. 데이터가 손상될 가능성이 있으면 프로세스 간 통신에 IsolatedStorageSettings를 사용하지 않는 것이 좋습니다.

  2. 오디오 에이전트의 경우: AudioTrack 클래스의 Tag 속성에 사용자 지정 데이터를 저장합니다. 오디오 에이전트에서 포그라운드 앱으로 보내는 알림의 경우 PlayStateChanged 이벤트 처리기에서 Tag 속성을 읽습니다. 포그라운드 앱에서 오디오 에이전트로 데이터를 전달하려면 OnPlayStateChanged(BackgroundAudioPlayer, AudioTrack, PlayState) 메서드의 구현에서 현재 트랙의 Tag 속성을 읽습니다.

Windows Phone SDK 7.1 에는 Windows Phone 예약된 작업 에이전트라는 백그라운드 에이전트용 프로젝트 템플릿이 포함되어 있습니다. 백그라운드 에이전트를 구현하는 경우 이 템플릿을 사용하여 솔루션에 프로젝트를 추가해야 합니다. 포그라운드 앱에 대한 프로젝트에서 프로젝트->참조 추가...를 선택하고 백그라운드 에이전트 프로젝트를 선택하여 백그라운드 에이전트 프로젝트의 출력에 참조를 추가합니다. 기존 앱에 대한 프로젝트 내에서 ScheduledTaskAgent를 구현하는 클래스를 만들면 안 됩니다. 백그라운드 에이전트는 포그라운드 앱과 동일한 어셈블리에 있는 경우에는 실행되지 않습니다.

백그라운드 에이전트 클래스 또는 네임스페이스의 이름을 바꾸면 포그라운드 앱에 대한 앱 매니페스트 파일을 수동으로 업데이트해야 합니다. 이 파일의 구조에 대한 자세한 내용은 Windows Phone 8의 앱 매니페스트 파일TASKS 요소 섹션을 참조하세요.

백그라운드 에이전트에 대한 메모리 제약 조건으로 인해 앱에서 백그라운드 이미지로 사용할 이미지를 동적으로 생성하는 경우 WVGA 해상도를 대상으로 하고 휴대폰에서 해상도가 더 높은 화면에 맞게 자동으로 이미지 크기를 조정할 수 있도록 하는 것이 좋습니다. 해상도가 더 높은 이미지를 생성하려고 하면 에이전트가 메모리 제한을 초과할 수 있습니다.

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

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