Application, Activity

|
안드로이드 플랫폼에서는 Application 이외에 Activity도 있고 Task 라는 개념도 있다. 이런 개념은 일반적인 OS의 것과 사뭇 달라 약간 혼란스러운 면이 있다. 일단 이런 용어들은 안드로이드에서만 사용하는 새로운 개념으로 생각하고 전반적인 모습을 살펴보도록 하자.


1. Android Applicatin Basic Concept
안드로이드 Application의 기본적인 컨셉은 Application, Activity, Activity Stack 그리고 Task의 4가지이다. 각각의 컨셉은 다음과 같다.


a. Application
Application은 하나 이상의 Activity와 Resource 등이 하나로 묶여 있는 꾸러미 (Bundle)를 말한다. Application은 APK 형식의 파일로 되어 있으며 단말에 복사 설치 할 수 있다.


b. Activity
Activity는 Android Application의 기본 구성 단위로 특정 동작의 수행을 나타내는 객체이다. 하나 이상의 Activity로 구성될 수 있으며 다른 Activity를 호출하거나 다른 Activity에게 노출하여 다양한 조합으로 Application을 구성 할 수 있다.

Activity는 보여주기, 편집하기, 전화걸기, 사진찍기, 검색하기, 데이터 보내기, 음성인식 시작하기 혹은 특정한 타입의 사용자 액션에 대한 동작과 같이 한가지 혹은 그 영역이 잘 정의된 형태의 Visual User Interface로 디자인 되었다.

당연한 이야기지만, 화면에 어떤 것을 표현하는 Application이라면 적어도 display에 대응되는 Activity를 적어도 하나 이상 가지고 있어야 한다.

Android 단말을 이용할 때 사용자들 User Interface를 통해 Activity들을 하나씩 시작하며 이동하게 되고, 내제된 동작에 대해 전혀 생각하지 않게 되므로 이런 경험(User Experience)들은 Activity에서 Activity로 넘어가든 Task에서 Task로 넘어가든 일관된 모습을 가져야 한다. 

Activity들은 특정 타입의 Content (데이터)를 처리하며 사용자 행동을 입력 받도록 되어 있다. 일반적으로, 각각의 Activity들은 Life Cycle을 가지게 되는데 이는 다른 같은 Application이나 Task 내에서도 독립적이다. - 각 Activity들은 독립적으로 시작되고, 필요에 따라 사용자 혹은 시스템에 의해 시작, 실행, 중지, 재게, 정지 그리고 재시작 한다. Activity들은 독립적이기 때문에 다양한 방법으로 재사용 될 수도 있고 다른 Activity들로 대치될 수도 있다.

이런 Activity는 Application Component 4가지 (Activity, Services, Broadcase Receiver, Content Provider) 중 가장 중요한 부분이다. Appclication Component 에 대한 자세한 내용은 Application Component을 참고하기 바란다.


c. Activity Stack

사용자가 Activity에서 Activity로 넘어감(Application이 넘어 갈 수도 있음)에 따라 Android 시스템은 사용자가 접했던 Activity들을 순차적으로 기록 유지하고 있게 된다. 이것이 Back Stack으로 알고 있는 Activity Stack이다. 일반적으로 사용자가 새로운 Activity를 생성할 때, Activity Stack에 추가되므로 BACK 키를 누르면 스택에 있는 이전 Activity를 보여준다. 그러나, 사용자가 마지막으로 HOME으로 온 경우는 BACK 키를 눌러도 되돌가 갈 수 없다. 

현재 Stack에 Activity를 추가하는 것은 activity가 새로운 task(Home으로 돌아가는 것 없이 task가 시작되었던 것 만큼 오래 걸림)로 시작하는 것과는 상관이 없으므로 뒤로 돌아가는 것은 이전 task에서 있는 activity들로 돌아가는 것을 허락하는 것이다.

사용자는 Application Launcher나 short-cut 아니면 "Recent Task" 스크린에서 Root Activity를 선택함으로써 가장 최근의 Home 보다 더 빨리 task를 가질 수 있다.

Activity만이 Activity Stack에 더해 질 수 있으므로 view, window, menu 그리고 dialog 등은 안된다. 그러므로, 사용자가 스크린 A를 가지고 있고 다음 이어진 순서로 스크린 B로 갔다가 BACK 키를 눌러 스크린 A로 돌아오기를 원한다면, nativigation을 설계 할 때 스크린 A는 Activity로 구현되어야 하는 것이다. 하나의 예외가 있다면 Application이 manage navigation 자체를 관리하는 경우이다.



d. Task

Task는 사용자가 특정 목적을 이루기 위해 따르게 되는 연속된 Activity들로 Activity가 어떤 Application에 속해 있는지는 상관 하지 않는다. 

새로운 Task에 대해 명확하게 정해지기 전까지 사용자가 시작하는 모든 Activity들은 현재 Task의 일부로 간주된다. 이런 Activity들은 다른 Application에도 있을 수 있다는 것이 주목할 만한 점이다. Contact에서 시작한 task가 E-mail address를 선택해서 email activity를 유지하고, file을 첨부해서 picture gallery에서 이미지를 선택 할 수 있는 것이다. Contacts, email 그리고 picture gallery는 모두 별도의 application이다.

Task를 시작하는 Activity는 Root Activity에서 호출된다. 이는 반드시 그런 것은 아니지만 Application Launcher, Home Screen의 Shourtcut 아니면 "Recent tasks" (HOME키를 오래 누르고 있으면 나옴)에서 빈번히 호출된다. 사용자들은 task를 처음 시작했을 때외 마찬가지로 root activity에 대한 icon을 선택하므로써 task로 되돌아 갈 수 있다. 한 번 task에 속해지면, BACK 키를 눌렀을 때 task의 이전 activity로 되돌아가게 된다. Activity Stack은 하나 혹은 그 이상의 Task로 만들어져 있다.

Task에 대한 몇 가지 예를 들어 보자:

* 첨부 데이터와 함께 문제 메시지를 보낸다
* 유튜브 비디오를 보고 email로 다른 사람들과 공유한다.


Interruping the Task
task의 매우 중요한 속성은 사용자가 다른 task를 수행하기 위해 현재 실행 중인 task를 interrupt를 할 수 있으며, 떠나 왔던 원래 task를 완료하기 위해 다시 되돌아 갈 수 있다는 것이다. 이것은 사용자들이 여러개의 task를 동시에 실행 할 수 있으며 task 간 전환도 할 수 있게 하는 것이다. 다른 task로 넘어가는 방법이 두 가지가 있는데, 사용자가는 interrupt 전의 위치로 되돌아 올 수 있어야 한다.

* 사용자는 notification에 의해 interrupt 된다 - notification은 나타나면 사용자는 그에 맞는 동작을 하길 원한다
* 사용자가 다른 task를 수행 하길 원한다 - 사용자는 HOME 키를 눌러 Home으로 되돌아가 Applicaiton을 실행한다.


물론 예외적인 규칙이 있다. 위에 언급된 두 가지 방법 이외, Task를 시작하는 제 3의 방법이 있는데, Activity를 시작 할 때 자기 자신을 Task로 시작하게 하는 경우다. Maps와 Browser가  이런 동작을 하는 Application이다. 

예를 들어, email에서 address를 선택하는 것은 Maps activity를 새로운 task로 시작하는 것과 같고, email에서 link를 선택하는 것은 Browser Activity를 새로운 task로 시작하는 것과 같다. 이런 상태에 BACK 키를 누른 경우 Home에서 시작한 것이 아니므로 다른 Task(email)에 있는 이전 Activity로 되돌아 가게 된다.




2. Activity & Task

Activity와 Task는 기존의 일반적인 OS의 것과는 꽤 많은 차이가 있어 위의 설명으로는 이해가 어려울 수 있다. 다음의 예를 들어 Activity와 Task의 관계에 대해 명확히 알아보자

a. Home Key와 Back의 차이 

Application을 실행하면 해당 Application의 Root Activity가 먼저 실행 된다. 그 상태에서 BACK 키나 HOME 와 같은 Activity 전환에 대한 키를 누를 수가 있다. Android 에서는 이런 동작에 따라 Activity와 Task에 대한 동작이 달라진다.

1) Home Activity에서 Application을 실행

Home에서 Application을 실행 할 경우 Application의 Root Activity는 다음과 같은 상태가 된다.

Home Activity : Foreground → Background
App Activity : <Create> → Foreground




2-1) BACK 키를 눌러 Home으로 이동하는 경우 

만약 BACK 키를 누를 경우 Back Activity는 Home Activity이므로 현재 Activity를 제거하고 Home으로 되돌아간다. Back 키를 누르더라도 Activity가 Destory 되지 않는 예외 경우도 있는데 Audio Player와 처럼 Background 실행이 필요한 경우Service 형태로 처리한 경우이다. 

Home Activity : Background → Foreground
App Activity : Foreground → <Destory>

그림으로 나타내 보면 다음과 같다. 



이 상태에서 Application을 실행하면 처음 Application을 실행 할 때와 동일한 동작을 수행한다. 




2-2) HOME 키를 눌러 Home으로 이동하는 경우

Activity를 실행 중 HOME 키를 누르면 무조건 Home Activity로 되돌아간다. 이럴 경우 실행 중이던 Activity는 잠시 Background 상태가 되지만 제거 되지는 않는다. 

Home Activity : Background → Foreground
App Activity : Foreground → <Stop>  → Background




만약 이 상태에서 Stop된 Application과 동일한 Application을 실행 하는 경우 이미 실행 중이며 Background 상태였던 Activity가 다시 활성화 된다.

Home Activity : Foreground → Background
App Activity : Background → <Running>  → Foreground


만약, 새로운 Application을 실행할 경우 새로운 Task 가 활성화 되는 것으로 기존 Application과 동시에 실행되는 모습이 된다.

Home Activity : Foreground → Background
App Activity : Background in Task #1
New Acitiivy : <Create> → Foreground in Task #2




b. Activity 재사용하기

Activity A가 다른 application에 있는 Activity B를 시작할 때, activity B는 재사용 되었다(re-used)라고 한다. 이런 경우는 보통 Activity A는 여건이 없고 Activity B에는 있을 때 발생한다.


1) Contacts에서 Gallery를 재사용하여 사진얻기

Contacts Activity는 주소록의 사진 항목을 가지고 있지만, 사진이 보관되어 지는 곳은 보통 Gallery이다. 그렇기에 Contacts에서 사진을 가져오기 위해 Gallery activity를 재사용 할 수 있다. 이것은 Gallery activity의 재사용에 대한 좋은 예일 것이다. 다음 그림은 이미지 영역 지정(Crop)까지의 일련의 Activity 들을 나타내고 있다.



사용자가 Contacts를 선택하고, viewing을 위한 주소를 선택하고, MENU > Edit를 선택하고, Gallery activity를 실행 해 줄 사진 필드를 선택한다. 사용자는 원하는 사진을 선택하고, 영역을 지정(Crop) 한 후 저장한다. 이 이미지는 주소록의 사진 필드로 넣어져야 하기 때문에 저장 된다.

Gallery에서 Contact application로 사진을 준다는 것에 주목한다. 다음 예제는 result를 가져오지 않는 activity의 재사용에 대한 것이다. 이 또한 activity나 activity stack을 통핸 navigation history를 묘사하고 있음에 주목해야 한다. - 사용자는 모든 activity의 back 동작을 통해야만 Home으로 되돌아 갈 수 있다.

application을 디자인할 때 다른 application에 있는 activiity를 어떻게 재사용할지 생각하는 것과 자신이 만든 activity를 다른 applicatin에게 어떻게 재사용하도록 할지를 염두해 두는 것은 은 매우 바람직한 것이다. 만약 activity를 추가 할 때 기존에 있던 Activity와 동일한 intent filter를 적용한다면, 시스템은 사용자에게 이 activity들 중 어떤 것을 선택 할 것인지 알려준다.


2) Gallery에서 Messaging 재사용하여 사진 공유하기

공유라는 것은 한 application이 다른 application으로 부터 온 activity를 재사용하는 또 다른 좋은 예제이다. 
아래 그림에서와 같이, 사용자는 Gallery를 시작하고, 사진을 선택하고, MENU > Share를 선택한 후 Messaging을 집는다.
이것은 Messaging Activity를 시작하게 하며, 새로운 Message를 만들고 원본 이미지를 첨부한다. 사용자는 "받는 이" 필드를 채우고, 짧은 문장을 작성 후 보내게 된다. 현재 사용자는 Messaing 프로그램에 있게 된다. 만약 사용자가 Gallery로 되돌아가려 하면, 반드시 BACK 키를 눌러야 한다. (사용자는 HOME으로 가기 위해 모든 Activity에 대해 Back 동작을 수행 할 수 있다)


이전 Contacts 예제와 달리, Message activity의 재사용에 대한 예제는 Gallery activity가 시작될 때 아무것도 가져가지 않는다.


c. Activity 대체

윗 글에서 Actiivity의 intent filter를 기존 activity와 동일하게 설정 할 경우 사용자가 어떤 Activity를 이용할지 선택할 수 있다고 언급 했었다. 이를 Activity 대체라 부른다.

이것은 Activity A가 다른 application에 있는 Activity B를 대체하는 경이다. 이런 상황은 보통 activity A가 activity B의 기능보다 더 나은 기능을 제공 하기 때문에 발생한다. 다시 말해서, A와 B는 동등하거나 A가 B를 대체할만큼 A와 B가 동등하다는 것이다. 이 경우 A와 B가 꽤 많이 다른 Activity들이며 서로가 다른 것들을 가지고 있을 때 Activity의 재사용과 두드러지게 대비된다.

이 예제에서는, 사용자는 Phone Ringtone Activity에 대한 대체로 Rings Extended라는 것을 다운로드 했다. 이제 Settings, Sound & Display, Phone Ringtone을 선택할 때, 시스템은 Android System의 ringtone activity와 새로운 것 사이에서 고를 수 있도록 해 준다. 이 다이얼로그 박스는 "Use by default for this action"이라는 항목을 기억할 수 있다. 만약 "Rings Extended"를 선택하면 Activity는 실행이됙 기존 Android ringtone activity는 대체된다.



c. Multi Tasking

Activity가 실행 중 HOME 키를 누르면 새로운 Task로 인식되며 Multi Tasking이 시작된다. 다음은 Maps에 대한 예로 설명한다.

1단계 - 사용자는 View Map Activity를 실행하고 지도 위치를 검색한다. 네트워크가 느리다고 한다면, maps는 지도를 그리는데 비정상적으로 오래 걸린다.

2단계 - 사용자는 이렇게 기다리는 동안에 뭔가를 하고 싶어하므로 HOME 키를 눌러 maps의 네트워킹 접속을 방해하지 않고 background에서 loading이 계속되도록 한다.

Activity가 Backgournd로 옮겨지면 Activity Lifecycle에 따라 onStop() 메소드가 호출이 되므로 Activity를 작성 할 때 계속 할 것인지 아니면 잠시 멈출 것인지 결정 할 수 있다. 네트워크로 부터 데이터를 다운로드하는 Activity들에 있어서 downloading을 계속 하도록 두는 것은 추천 할 만한 것으로 사용자의 multi-task를 가능하게 한다.

3단계 - map activity는 이제 Backround에서 실행되고 있고, Home은 Foreground로 실행되고 있다. 사용자가 Calendar Activity를 실행하면 foreground가 되고, 사용자 focus를 가지며, 오늘 날짜의 달력이 보여진다.



4단계 - 사용자가 HOME을 누르러 Maps를 다시 실행하면 지도 데이터가 완전하게 load 되어진 모습이 보여진다.



Home에 있는 applicaion laucher는 "View Map"과 "Day View" Activity를 별도의 task로 실행했으므로 시스템은 multitasking이다.


d. 두 개의 시작점으로 실행하기

모든 application은 적어도 하나의 이상의 시작점 (entry point)를 가져야 한다 - 시작점는 사용자 혹은 시스템이 application 내부에 있는 activity에 접근하기 위한 방법이다. Home에 있는 applicatin laucher에 있는 각각의 icon이 application의 시작점을 나타내고 있는 것이다. Application은 다른 application에서 실행 될 수도 있다. 또한 각각의 activity는 application에 잠재되어 있는 시작점이다.


Phone Application은 Contacts와 Dialer 두 개의 시작점을 가지고 있다.ㅏ용자는 Contacts에서 phone number를 선택하여 Dialer를 실행 할 수 있다. 아래 그림에서와 같이, 사용자는 Contacts Icon을 선택하여 Activity를 실행 시킬 수 있으며, Phone Number를 선택하여 Dialer Activity를 호출, 전화를 걸 수 있다.

사용자 한번이라도 application 실행 중에 있다면, Tab과 메뉴 아이템, 리스트 아이템, 스크린에 있는 버튼 혹은 다른 interface control을 이용하여 새로운 주소록을 만들거나 편집과 같은 다른 Activity에 접근할 수 있다.


e. Task 전환

이 시나리오는 사용자가 두 개의 task를 어떻게 전환하는지 보여준다. 이 예제에서, 사용자는 문자 메시지를 작성하고 이미지를 첨부하지만 끝내기 전에 잠깐 달력을 본다. 그리고 첨부된 사진이나 문자 메시지를 남겼던 곳으로 되돌아 온다.

1) Task 시작하기
문자 메시지와 사진을 첨부하려 한다면 다음과 같이 선택해야 한다:

Home > Messaing > New Message > MENU > Attach > Pictures. 이 마지막 단계는 사진을 선택하기 위해 Picture Gallery가 실행된다. Picture Gallery는 별도의 application임을 알아둔다.



사진을 선택하기 전쯤에서 잠깐 멈춰서 별도의 task에서 Calendar를 보려 한다. 현재 activity가 Calendar로 바로 가는 버튼이 없으므로 Home에서 시작해야 한다.

2) 두 번째 Task 시작하기

Home > Caledar를 선택하여 Calendar 이벤트를 본다. Application Laucher는 각각의 application이 실행 될 때 마다 새로운 task로 실행을 하기 때문에 Calendar는 Home에서 새로운 task로 실행이 된다.


3) 첫 번째 Task로 전환하여 마무리 하기

Calendar를 다 보고 난 후 root activity를 다시 시작하여 사진을 첨부하는 곳으로 되돌아 갈 수 있다:
Home > Messaging 선택, 이것은 Messaing으로 가는 것이 아니라 떠나기전 있던 곳인 Picture Gallery로 바로 진입한다. 이제 메시지에 첨부할 사진을 선택하고, 메시지를 보내면 처음 시작했던 task를 마치게 된다.






.




참고 : http://developer.android.com/guide/practices/ui_guidelines/activity_task_design.html

**

'Android 개발 > Android SDK' 카테고리의 다른 글

안드로이드 App 위젯을 만들어 보자  (0) 2011.05.02
Screen On / Off 핸들링  (0) 2011.05.02
Native Content Providers List  (0) 2011.04.19
안드로이드 2.0 이상 주소록 삽입  (0) 2011.04.19
Android Mime Type  (0) 2011.04.14
And