이번시간에는 멀티태스킹에 대해서 살펴 볼 것입니다.

멀티태스킹 기능은 원래는 윈도우폰에서는 지원되지 않았고 이번에 망고버전으로 업데이트 되면서 새로 추가된 기능입니다. 멀티태스킹이라는 것은 무엇일까요? 일반적으로 우리가 쓰는 윈도우에서 제가 문서작업을 하면서 음악을 들을 수 있고 인터넷 익스플로러를 띄워서 인터넷 검색도 할 수 있습니다. 즉 여러 개의 프로그램을 모두 실행시킬 수 있다는 것이죠.

 

무릇 컴퓨터라면 이 모든 것을 한꺼번에 다 할 수 있어야 생각하지만 20년전만 하더라도 그러지 않았습니다. 컴퓨터가 할 수 있는 작업은 한번에 한 프로그램밖에 실행이 안되었죠. 그래서 제가 어렸을때 도스쓰던 시절에는 전혀 상상 못했던 작업이지요. 물론 사실 멀티태스킹이 가능한 운영체제는 아주 오래전에 그 개념이 나왔습니다만 일반적으로 유저들에게 보급되던건 아마도 윈도우95가 나오면서 아닐까요?

하여튼 기술의 발전은 정말 놀랍습니다. 98년도에 처음 저희 집에 ADSL이라는 것이 들어왔을 때만 하더라도 인터넷은 컴퓨터에 앉아서 해야 하는 것이었고 영화를 다운받아 본다는 것은 상상도 못했습니다. 하지만 이제 제 주머니에 있는 스마트폰으로 인터넷 검색도 하고 영화도 보고 세상 참 많이 좋아졌습니다.

좀 말이 길어졌습니다. 이번 시간에는 프로젝트 타일을 시작 영역에 고정시키고 백그라운드 에이전트를 만들어 프로젝트 타일을 업데이트 하는 방법을 알아보도록 하겠습니다.

 

제가 첨부로 올린 실습 폴더를 엽니다. 우리가 실습할 자료는 MSDN에서 제공한 자료를 토대로구성되었습니다,

1.PNG

위의 화면과 같이 Todo.Business 프로젝트를 찾아서 Shell 폴더안에 ShellTileHelpersCore 클래스를 생성합니다.

 

using Microsoft.Phone.Shell;

using System.Linq;

 

위와 같이 using 문을 추가합니다.

public static void Pin(Uri uri, ShellTileData initialData)

        {

           

            ShellTile.Create(uri, initialData);

 

        }

 

 

위 클래스를 추가합니다. 장치의 시작 영역에 타일을 고정할 수 있게 해주는 Pin 메서드를 만드는 구절입니다.

여기서 ShellTile은 무슨 역할을 할까요?

이런 Microsoft.Phone.Shell 네임스페이스의 클래스로 응용 프로그램의 Primary 타일과 Secondary타일을 관리하는 작업을 담당합니다. 무슨 말일까요? 쉽게 말하자면 이 ShellTile은 타일을 생성/제거하고 프로그램의 모든 타일을 포함하고 있는 컬렉션에 접근이 가능하도록 해줍니다.

 

 

public static void UnPin(string id)

        {

            var item = ShellTile.ActiveTiles.FirstOrDefault

                        (x => x.NavigationUri.ToString().Contains(id));

 

            if (item != null)

                item.Delete();

        }

        public static void UnPin(Uri uri)

        {

            var item = ShellTile.ActiveTiles.FirstOrDefault

                (x => x.NavigationUri == uri);

 

            if (item != null)

                item.Delete();

        }

 

위와 같이 UnPin 메서드의 오버로드 2개를 추가합니다.

타일을 제거하기 위한 프로세서는 다음과 같이 구성됩니다. 먼저 제거할 타일을 찾아 타일의 삭제기능을 실행합니다. Item.Delete 를 실행하죠. 그렇다면 지정된 타일을 어떻게 찾을까요? 바로 ShellTile.AactiveTiles 속성입니다. 이 것이 타일을 찾으면 삭제를 하죠.

public static bool IsPinned(Uri uri)

        {

            var item = ShellTile.ActiveTiles.FirstOrDefault

                (x => x.NavigationUri == uri);

 

            return item != null;

        }

 

        public static bool IsPinned(string uniqueId)

        {

            var item = ShellTile.ActiveTiles.FirstOrDefault

                (x => x.NavigationUri.ToString().Contains(uniqueId));

 

            return item != null;

        }

 

 

위의 화면처럼 클래스에 메서드를 더 추가합니다. UnPin 메서드와 유사한 성질을 갖는데요. 이러한 메서드는 타일이 있는지 없는지 확인을 하는 과정이라고 볼 수 있겠습니다.

2.PNG

다시 Todo 프로젝트 폴더로 가서 Push 폴더를 찾아 ShellTileHelperUI.cs를 생성합니다. 클래스 생성방법은 다들 아시죠? 이 클래스를 만드는 이유는 UI를 통해 Pin/UnPin 기능을 관리할 수 있도록 하기 위해서 입니다.

public static Uri GetDefaultTileUri(this Project project)

        {

            string color = ApplicationStrings.ColorBlue; // default to blue

            ColorEntryList list = App.Current.Resources[UIConstants.ColorEntries] as ColorEntryList;

            if (list != null)

            {

                ColorEntry projectEntry = list.FirstOrDefault(x => x.Color == project.Color);

                if (projectEntry != null)

                    color = projectEntry.Name;

            }

 

            return UIConstants.MakeDefaultTileUri(color);

        }

 

위의 화면처럼 지정된 프로젝트의 색상과 일치하는 타일 백그라운드 이미지로 연결되는 URI 생성 하는 메서드를 추가합니다.

public static Uri MakePinnedProjectUri(this Project p)

        {

            return UIConstants.MakePinnedProjectUri(p);

        }

 

위의 메서드를 추가합니다. 위 메서드는 해당 프로젝트에서 쉽게 UI를 얻을 수 있습니다.

 

public static bool IsPinned(this PhoneApplicationPage page)

        {

            return ShellTileHelpersCore.IsPinned(page.NavigationService.CurrentSource);

        }

 

        public static bool IsPinned(this Project project)

        {

            Uri uri = project.MakePinnedProjectUri();

            return ShellTileHelpersCore.IsPinned(project.Id.ToString());

        }

 

 

        public static void PinProject(Project p)

        {

           

            StandardTileData initialData = new StandardTileData

            {

               

                BackgroundImage = p.GetDefaultTileUri(),

                Title = p.Name,

            };

 

            Uri uri = p.MakePinnedProjectUri();

            ShellTileHelpersCore.Pin(uri, initialData);

        }

 

 

        public static void UnPinProject(Project p)

        {

            ShellTileHelpersCore.UnPin(p.Id.ToString());

        }

 

위의 메서드를 추가합니다. PinProject 메서드는 프로젝트를 시작 영역에 고정시키는 메서드를 추가하는 메서드이며 UnPinProject 메서는 프로젝트의 ID를 앞서 만든 UnPin 메서드에 전달합니다.

 

 

3.PNG

클래스를 저장하고 나서 위의 경로과 같이 파일을 찾아 들어갑니다. ProjectDetailsView.xaml.cs를 열면 됩니다.

이미 이 파일 내에는 appBar_OnPinProject 라고 메서드가 있습니다. 이 메서드가 하는 역할은 사용자가 응용 프로그램 표시줄에서 Pin/Unpin 아이콘을 누를 때 실행됩니다.

private void appBar_OnPinProject(object sender, EventArgs e)

        {

            Project project = DataContext as Project;

 

            if (project.IsPinned() )

                ShellTileHelpersUI.UnPinProject(project);

            else

                ShellTileHelpersUI.PinProject( project );

             

            UpdateProjectPinIcons();

        }

 

위의 화면과 같이 appBar_OnPinProject 메서드에 추가하면 됩니다. 이미 메서드 자체는 추가되 있을 겁니다. 위의 코드를 추가하면 되죠. 이 메서드가 하는 일은 프로젝트의 현재 상태에 따라 프로젝트를 Pin 할지 Unpin할지 정하고 이를 응용프로그램 표시줄 아이콘에 업데이트 합니다.

private void UpdateProjectPinIcons()

        {

            if ((DataContext as Project).IsPinned())

            {

                ((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).Text = ApplicationStrings.appBar_UnPin;

                ((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).IconUri = new Uri("/Images/appbar.unpin.png", UriKind.Relative);

            }

            else

            {

                ((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).Text = ApplicationStrings.appBar_Pin;

                ((ApplicationBarIconButton)ApplicationBar.Buttons[(int)Utils.ProjectDetailsViewAppBarButtons.PinProject]).IconUri = new Uri("/Images/appbar.pin.png", UriKind.Relative);

            }

        }

 

 

UpdateProjectPinIcons메서드를 찾습니다. 이 메서드도 이미 파일에 있습니다. 위와 같이 코드를 추가해 줍니다. 이 메서드가 하는 역할은 프로젝트의 Pin 상태에 따라 프로그램 표시줄 아이콘과 텍스트를 초기화 합니다.

이제 우리가 해야 할 일은 다한 것 같습니다. 저장을 한 뒤 프로그램을 에뮬레이터로 실행시켜 봅니다.

4.PNG

실행을 시키면 위와 같이 나타납니다.

5.PNG

초기화면이 위와 같이 나타납니다.

6.PNG

새로운 프로젝트를 추가합니다.

 

7.PNG

위와 같이 설정합니다.

 

 

 

8.PNG

메인화면으로 돌아가면 다음과 같이 나옵니다. 그리고 나서 plus를 눌러 Task를 추가합니다.

 

 

 

9.PNG

Task를 추가하면 위와 같이 화면이 나옵니다.

 

 

 

10.PNG

Task를 바탕화면에 고정시켜 볼 것입니다. 가운데 버튼을 눌러주세요.

 

 

 

12.PNG

위와 같이 프로젝트 파일을 시작 영역에 고정시켜 봅시다.

 

 

12.PNG

이번시간에는 프로젝트 타일을 시작 영역에 고정시키는 방법에 대해서 실습해 보았습니다.

다음 시간에는 백그라운드 에이전트를 구현해 보도록 하겠습니다.

정말 수고 많으셨습니다.

 

* 실습 화일은 다음에 올라오는 실습 글에 첨부되어 있는 파일을 다운받으시기 바랍니다. 첨부용량 제한으로 인하여 첨부파일을 한번에 올리지 못하는점 양해 부탁드립니다.

 





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