안녕하세요.

저번 시간에는 프로젝트 타일을 시작 영역에 고정시키는 방법에 대해서 실습해 보았습니다. 잘 따라 하셨는지요? 저번시간부터는 소스코드가 copy 가능하도록 캡쳐를 하지 않았습니다. 그래서 타이핑 하는데 조금이나마 시간을 줄이실 수 있을것이라 생각됩니다.

이번 시간에는 백그라운드 에이전트를 구현해 보도록 하겠습니다. 저번시간의 내용과 이어지는 내용이니 저번시간 학습을 하셔야 이번 시간 학습이 가능합니다. 명심해 주세요!

 

1.PNG

우선 처음에 위와 같이 백그라운드 에이전트와 관련된 프로젝트를 추가해야 합니다. 새로운 프로젝트를 생성할 것입니다.

 Windows Phone Task Scheduler Agent 탬플릿을 선택한 뒤 TaskLocationAgent로 합니다.

 

 

 

 

 2.png

그다음 우리가 새로 만든 프로젝트와 기존의 Todo 프로젝트를 연결해 주어야 합니다. 우리는 Todo를 이용해 백그라운드 에이전트를 표시할 것이니까요. Todo 프로젝트를 선택한뒤 마우스 오른쪽 버튼을 눌러 Add Reference 를 눌러줍니다.

 

 

 

 

 

3.PNG

Add Reference에서 위와 같이 Projects -> TaskLocationAgent를 선택해 줍니다. 오케이~

4.PNG

백그라운드 에이전트를 구현하기 위해서는 시작을 하고 끝내는 코드가 있어야 합니다. 시작도 끝도 없으면 무한 반복 되겠죠? ViewModels 폴더에서 SettingsViewModel.cs 를 실행합니다.

PeriodicTask periodicTask = null;

const string PeriodicTaskName = "TidyPeriodic";

위와 같은 코드를 삽입합니다.

 PeriodicTask Microsoft.Phone.Scheduler 네임스페이스의 클래스로서 규칙적으로 짧은시간동안 실행되는 작업을 나타냅니다. 이러한 변수는 작업의 뒷부분에서 사용하게 되죠.

void OnSave(object param)

        {

            if (UseBackgroundTaskUpdates || UseBackgroundLocation)

            {

                EnableTask(PeriodicTaskName, ApplicationStrings.PeriodicTaskDescription);

            }

            else

                DisableTask(PeriodicTaskName);

 

            SaveSettings();

        }

 

Save 메서드를 찾아 위와같이 코드를 추가해 주세요. EnableTask DisableTask를 사용하고 있습니다. ,두개의 메서드를 이제 추가해 주어야 합니다.

void EnableTask(string taskName, string description)

        {

            PeriodicTask t = this.periodicTask;

            bool found = (t != null);

            if (!found)

            {

                t = new PeriodicTask(taskName);

            }

 

            t.Description = description;

            t.ExpirationTime = DateTime.Now.AddDays(10);

 

            if (!found)

            {

                ScheduledActionService.Add(t);

            }

            else

            {

                ScheduledActionService.Remove(taskName);

                ScheduledActionService.Add(t);

            }

 

            if (Debugger.IsAttached)

            {

                ScheduledActionService.LaunchForTest(t.Name, TimeSpan.FromSeconds(5));

            }

        }

 

 

EnableTask 메서드는 Periodic Task를 찾아서 설명과 만료시간을 업데이트 해주는데요. 그런데 만약에 업데이트가 안된다면 어떻게 될까요? 이럴땐 기존 현재 작업하는 Task는 삭제하고 새로운 Periodic Task를 만들어줍니다. ScheduledActionService는 도대체 뭐하는 녀석일까요 바로 예약 Task를 관리하게 해줍니다.

 

Enable을 만들었으므로 Disable도 만들어야 겠죠?

void DisableTask(string taskName)

        {

            try

            {

                PeriodicTask t;

                if (periodicTask != null && periodicTask.Name != taskName)

                    t = periodicTask;

                else

                    t = periodicTask = ScheduledActionService.Find(taskName) as PeriodicTask;

 

                if (t != null)

                    ScheduledActionService.Remove(t.Name);

            }

            finally { };

        }

 

ScheduleActionService를 찾아서 이것을 지우는 역할을 하는 것이 바로 DisableTask의 역할입니다.

 그 다음에 SettingsViewModel 클래스를 찾아갑니다. 그리고 난 뒤 다음과 같이 수정해 줍니다.

public SettingsViewModel()

        {

            syncProvider = new LocalhostSync();

 

            syncProvider.DownloadFinished += DownloadFinished;

            syncProvider.UploadFinished += UploadFinished;

            syncProvider.DownloadUploadProgress += OperationProgress;

 

 

            periodicTask = ScheduledActionService.Find(PeriodicTaskName) as PeriodicTask;

 

 

 

            if (periodicTask != null)

                IsBackgroundProcessingAllowed = periodicTask.IsEnabled;

            else

                IsBackgroundProcessingAllowed = true; ;

 

            LoadSettings();

 

 

        }

SettingsViewModel 에서 해야할 일은 이제 다 끝났습니다. 혹시 모르니 저장 잊지마시기 바랍니다.

그다음에 해야할일은 Todo.Business TaskLocationAgent를 참조하는 일입니다. 전에 Todo프로젝트에 참조를 하는 방법을 알려드렸으니 응용하시면 됩니다.^^

 5.PNG

그다음 위의 화면과 같이  TaskLocationAgent 내에 있는 TaskScheduler.cs 파일을 엽니다.

using Todo.Misc;

 

우선 처음에 using구문부터 추가합시다.

protected override void OnInvoke(ScheduledTask task)

        {

 

            SettingsWorkaround preferences = SettingsWorkaround.Load();

            if (preferences == null)

            {

                NotifyComplete();

                return;

            }

 

 

            if ( preferences.UseTileUpdater )

                DoTileUpdates(null);   

 

            else

                this.NotifyComplete();

 

        }

 

OnInvoke 메서드에 다음과 같이 수정합니다.

이 메서드는 프로그램의 설정을 통해 사용자에 의해 어떠한 백그라운드 업데이트가 활성화 되었는지 확인한

다음 그에 맞게 대응을 합니다. 셋팅되어있는 것을 로드한 뒤 파일 업데이터가 활성화 되면 파일이

활성화 (DoTileUpdates) 되는것을 보실 수 있습니다.

 

 

void DoTileUpdates(object ununsed)

        {

 

            TaskProgressTileUpdater updater = new TaskProgressTileUpdater();            

            updater.Completed += new EventHandler<TaskHelperEventArgs>(updater_Completed);           

            updater.Start();

        }

 

다음과 같이 DoTileUpdates를 추가합니다.

 

8.PNG

그리고 위의 TaskLocationAgentTaskLocationAgent 프로젝트에 TaskProgressTileUpdater.cs IBackgroundTaskHelper.cs 를 추가합니다. 두개의 클래스 파일은 첨부된 Asset.zip 파일 압축을 푸시면 있습니다.

 6.PNG

이제 모든 것을 다 마치셨습니다. 실행을 시켜보겠습니다.

 

실행을 시키신 뒤 위의 Show overdue tasks count on tile 을 클릭하시고 체크 버튼을 누르세요.

프로젝트에 task들을 임의적으로 추가하시고 백그라운드 에이전트에서 살펴볼 것입니다.

7.PNG

위와 같이 현재 백그라운드 에이전트가 정상적으로 작동하면서 타일이 업데이트되는 것을 알 수 있습니다.

 

저번시간과 이번시간까지 걸쳐 2회의 강의동안 멀티태스킹을 직접 실습해 보았습니다.

멀티태스킹은 이번 윈도우폰7 망고버전에 새로 추가된 기능입니다. 멀티태스킹을 어플리케이션에 적용하는 것은 이제 필수이기 때문에 여러분들도 언젠가 어플리케이션을 만드실 때 멀티태스킹을 적용해야 할 단계가 오시리라 믿습니다. 그때 적용을 시켜보시기 바랍니다.

본 강의는 MSDN의 강의를 기초로 제작되었습니다. 감사합니다. 다음시간에 뵙겠습니다.





안녕하세요.윈도우폰에 관심이 많은 너만바라보면 입니다.