안드로이드 튜토리얼 목차 - Android Tutorial List
[Android Tutorial Extra #01] Activity(액티비티)가 뭔가요?



안드로이드 개발자 가이드 - Activities(액티비티)

안드로이드 애플리케이션에서 Activity(액티비티)는 화면을 제공하는 컴포넌트 입니다.
전화를 걸거나, 사진을 찍거나, 메일을 보내거나, 지도(map)를 보거나 하는 등, 사용자는 뭔가를 하기위해서 액티비티와 상호작용을 할 수 있습니다.
각 액티비티에는 사용자 인터페이스(User interface)를 그릴 수 있는 하나의 윈도우(window)가 주어집니다.
윈도우는 일반적으로 화면을 가득 채우고 있지만, 다른 윈도우의 탑(on top of other windows)에 있는 화면과 플로트(float)보다 작을수도 있습니다.

보통, 하나의 애플리케이션은 각 액티비티들 간 결합이 느슨한 여러개의 액티비티로 구성되어있습니다.
일반적으로 하나의 애플리케이션안에서 액티비티 하나는 "메인(main)" 액티비티로 지정되어 사용자가 애플리케이션을 켰을때 첫번째로 제공(보여지게)됩니다.
액티비티들은 다른 액션을 수행하기 위해서 또다른 액티비티를 실행(start) 할 수 있습니다.
새로운 액티비티가 실행(start)될 때마다, 이전의 액티비티는 멈추게 되고, 시스템은 멈추어진 이전의 액티비티를 하나의 스택(the "back stack")에 보관하게 됩니다.
새로운 액티비티가 실행될 때, 새로 시작된 액티티티는 백 스택 back stack에 넣어지고, 유저의 포커스를 취합니다.(back stack의 top에 push되어지면서 화면에 나타난다.)
백 스택 back stack은 "후입선출 last in, first out"이라는 Queue 매커니즘을 기본적으로 준수합니다. 그래서 유저가 현재있는 액티비티에서 백 키 Back key를 눌렀을 때, 스택에 있던 현재 액티비티는 나오게(pop)되고 이전의 액티비티를 다시 실행(resume)합니다.
(백 스택 back stack에 대해서는 Tasks and Back Stack 도큐먼트에 자세히 설명되어있습니다.)

새로운 액티비티가 실행(start)되어 (현재의) 액티비티가 멈췄을 때, 액티비티는 액티비티 생명주기 Activity's lifecycle 콜백 메소드를 통해 상태 변화를 알립니다.
액티비티에는 상태의 변화를 리시브 receive 할지도 모르는 여러개의 콜백 메소드들이 있습니다.
이 메소드들은 시스템이 액티비티를 생성 creating했는지, 정지 stopping했는지, 재개 resuming했는지, 파괴 destoying했는지의 상태에 대한 콜백 메소드입니다.
그리고 이런 각각의 콜백들은 상태 변화에 적합한 특정 작업을 수행할 수 있는 기회를 제공합니다.
예를 들면, 액티비티가 정지(onStop)되었을 때, 액티비티에서 메모리를 많이 차지하는 객체(Large object)나 
네트워크, 데이터베이스 커넥션해제 release 할 수도 있습니다.
액티비티가 재개(onResume)되었을 때, 필요한 리소스들을 다시 되찾을 수 있고, 중단 interrupt 되었던 액션을 재개할 수 있습니다. 
이런 상태 전환은 액티비티 생명주기의 일부입니다.
(Activity의 subclass에서 액티비티의 생명주기에 있는 콜백 메소드들을 재구현(override)해서 사용하면, 각 상태 변화에 맞는 처리를 할 수 있습니다.) 

문서의 나머지 부분은 액티비티를 어떻게 빌드 build하고 사용 use하는지에 대한 기본적인 내용과 액티비티 생명주기 작동에 대한 전반적인 내용을 설명합니다. 당신은 다양한 액티비티 상태들 사이의 변화를 제대로 관리할 수 있게 될 것입니다. 



 Creating an Activity - 액티비티 생성하기(만들기)

액티비티를 create 하기 위해서, 당신은 Activity의 subclass를 작성해야만 합니다(또는 기존에 있는 Activity의 subclass의 subclass를 작성해야 합니다).
당신은 Activity의 subclass에서 시스템이 호출하는 콜백 메소드들 callback methods을 구현해야 합니다. 시스템은 액티비티가 
create 될때, stop 될때, resume 될때, destory될때 등 액티비티의 상태가 변할 때, 콜백 메소드들을 호출합니다.

두 개의 중요한 콜백 메소드들,

onCreate()
당신은 이 메소드를 구현해야 합니다. 시스템(안드로이드)은 당신의 액티비티가 createing 될 때 이 메소드를 호출합니다. 당신의 구현에서, 당신은 액티비티의 필수 컴포넌트들을 초기화 할 수도 있습니다. 가장 중요한 것은, 이 메소드는 액티비티의 사용자 인터페이스를 위한 layout을 정의하는 setContentView() 를 호출해야만 하는 위치라는 것입니다.

onPause()
시스템(안드로이드)은 사용자(user)가 당신의 액티비티를 떠나는 첫번째 표식으로서 이 메소드를 호출합니다. (그렇지만, 항상 액티비티가 destory 되고있다는 것을 의미하는 것은 아닙니다.)
보통 이 메소드는 현재의 사용자 세션을 지속해야 하는 이상, 어떤 변화를 커밋 commit해야 하는 위치 입니다.(사용자는 다시 돌아오지 않을수도 있기때문이죠.)
(사용자가 처리한 데이터의 내용을, onPause()단계에서 저장하거나 해야한다는 의미입니다.)
 

다른 생명주기의 콜백 메소드이 몇가지 있습니다.
당신은 
액티비티들 사이에 유연한 사용자 경험 a fluiid user experience를 제공하기 위해서 이 메소드를 사용해야 합니다.
그리고 
액티비티가 정지(stop)되거나 심지어 파괴(destory)를 일으키는 예상치 못한 중단(interruptions)을 처리해야 합니다. 생명주기의 콜백 메소드들 전부에 대해서는 Managing the Activity Lifecycle 섹션에서 설명합니다.



 Implementing a user interface - 유저 인터페이스 구현하기

액티비티에서 유저 인터페이스는  View 클래스에서 파생된 객체인 뷰들의 계층구조 a hierarchy of views에 의해서 제공됩니다.
각각의 뷰는 액티비티의 윈도우 Activiti's window 안에서 특정한 직사각형의 공간을 컨트롤 합니다. 그리고 각각의 뷰는 사용자 상호작용 user interaction에 반응할 수 있습니다.
예를 들어, 하나의 뷰가 버튼이라면, 이 버튼은 사용자가 버튼을 터치했을 때, 액션을 시작합니다.

안드로이드는 당신이 레이아웃을 디자인하고 구조화하는데 사용할 수 있도록, 많은 준비된 뷰들을 제공합니다.
"위젯 Widgets"은 화면에서 시각적인(그리고 상호작용하는) 요소를 제공하는 뷰입니다. 버튼, 텍스트 필드, 체크박스, 또는 그냥 이미지같은 것이죠.
"레이아웃 Layouts"ViewGroup에서 파생된 뷰입니다. 뷰 그룹 ViewGroup은 자식 뷰들 child views를 위한 특별한 레이아웃 모델입니다. 리니어 레이아웃, 그리드 레이아웃, 릴레이티브 레이아웃 같은 것들이 뷰 그룹입니다.
당신은 또한 View와 ViewGroup의 subclass로 
자신만의 위젯과 레이아웃을 만들 수 있습니다(또는 기존의 subclass의 subclass일 수 있겠죠). 그리고 이렇게 만든 위젯과 레이아웃을 당신의 액티비티 레이아웃으로 적용할 수 있습니다.

당신의 애플리케이션 리소스에 저장된 XML layout을 사용하는 것레이아웃을 정의하는 가장 일반적인 방법입니다.
이 방법으로, 당신은 
액티비티의 동작을 정의하는 소스코드로 부터 유저 인터페이스의 디자인을 별도로 유지할 수 있습니다.
(액티비티에서는 동작을 정의하고, XML layout에서는 디자인을 정의한다는 것을 의미하는듯합니다.)

당신은 setContentView()에서 레이아웃의 리소스아이디를 전달함으로써 액티비티의 UI를 위한 레이아웃을 설정할 수 있습니다.

당신은 또한 액티비티 코드에서 new View를 통해 뷰를 만들수 있고, new View를 ViewGroup에 insert함으로써 뷰 계층구조를 구축할 수 있습니다.

유저 인터페이스를 만드는 자세한 방법은 User Interface 도큐먼트를 보시면 됩니다.



 Declaring the activity in the manifest
 - 매니페스트에서 액티비티 선언하기

시스템(안드로이드)에서 당신의 액티비티에 접근할 수 있도록 하기 위해서 manifest 파일에 당신의 액티비티를 선언해야 합니다.
액티비티를 선언하기 위해, manifest file을 열고, <application> 엘리먼트의 자식으로 <activity> 엘리먼트를 추가합니다.

예를들면,

<manifest ... >
 
<application ... >
     
<activity android:name=".ExampleActivity" />
      ...
 
</application ... >
  ...
</manifest >

액티비티의 label, icon, 액티비티 UI의 theme 등을 정의하는것과 같이 액티비티의 특징을 정의하기 위해, 몇가지 다른 애트리뷰트들을 포함할 수 있습니다.
android:name 애트리뷰트는 액티비티 애트리뷰트 중 유일하게 필수적인 애트리뷰트 입니다. 이 애트리뷰트는 액티비티의 클래스 이름을 지정합니다.
한 번 애플리케이션을 발행 publish하면, 이름을 변경할 수 없습니다.
만약 이름을 변경하면, 애플리케이션 바로가기 short cut같은 몇가지 기능들을 작동하지 않도록 할 것이기 때문입니다.
(Things That Cannot Change라는 블로그 포스트를 읽으세요.)

매니페스트에 액티비티를 선언하는 것에대한 더 많은 정보는 <activity> 엘리먼트를 참조하세요.



 Using intent filters

<activity> 엘리먼트는 다른 애플리케이션 컴포넌트들이 액티비티를 어떻게 작동시킬 수 있는지에 대하여 선언하기 위해서, <intent-filter> 엘리먼트를 사용해 다양한 인텐트 필터를 지정할 수 있습니다.

Android SDK tool을 사용해서 새로운 애플리케이션을 만들때, (기본적으로 만들어지는) 스터브 액티비티는 액티비티가 "main" 액션에 반응 할 수 있도록, 그리고 "launcher" 카테고리에 위치할 수 있도록, 자동적으로 인텐트 필터를 포함합니다.

인텐트 필터의 예,

<activity android:name=".ExampleActivity" android:icon="@drawable/app_icon">
   
<intent-filter>
       
<action android:name="android.intent.action.MAIN" />
       
<category android:name="android.intent.category.LAUNCHER" />
   
</intent-filter>
</activity>

<action> 엘리먼트는 액티비티가 애플리케이션에서 "main" 엔트리 포인트라는 것을 지정합니다.
<category> 엘리먼트는 액티비티가 시스템의 런처 애플리케이션에서 리스팅 될 수 있도록 지정합니다.(유저가 해당 액티비티를 launch 하는것(to launch)을 수용할 수 있도록 지정하는 것이죠.)

만약 당신의 애플리케이션에서 자체적으로는 포함하면서, 다른 애플리케이션이 작동시키는 것은 수용하지 않으려면, 당신은 다른 인텐트 필터를 필요로 하지 않습니다. 단지, 하나의 액티비티가 "main" 액션과 "launcer" 카테고리를 가지고 있으면 됩니다. 위에서의 예처럼 말이죠.
다른 애플리케이션에서 사용하도록 만들어지는것을 원하지 않는 액티비티들은 인텐트 필터를 각지지 않으면 됩니다. 그리고 그들은 당신스스로 명백한 인텐트를 사용해서 실행(start)할 수 있습니다. (액티비티를 실행하는 것은 다음 섹션에서 논의됩니다.)
(다른 애플리케이션에서 내가 만든 애플리케이션안에있는 액티비티를 실행시키지 못하게 하려면 인텐트 필터를 정의하지 않으면 된다는 얘기입니다. 이렇게 해도 내가 만든 애플리케이션 안에서는 명백한 인텐트-클래스를 지정하고 시작하는-로 액티비티를 실행할 수 있다는 것이죠.)




안드로이드 개발자 가이드에서는 하나의 페이지로 되어있지만, 내용이 조금 길고, 섹션이 나뉘어져 있어 글 2개로 번역합니다. 번역 오류는 과감히 욕하시면서 알려주세요.



다음 섹션 가기 - 
[Android Tutorial Extra #01] Activity(액티비티)가 뭔가요? - 2
Posted by croute

댓글을 달아 주세요

  1. 김승기 2012.01.04 22:43  댓글주소  수정/삭제  댓글쓰기

    정말 감사합니다! 안드로이드 개발에 대한 블로그 찾다가 왔는데 정말 공부하기 좋은 것 같습니다!
    다시한번 감사드립니다!

  2. 2012.02.14 13:50  댓글주소  수정/삭제  댓글쓰기

    비밀댓글입니다

    • Favicon of https://croute.me BlogIcon croute 2012.02.14 19:53 신고  댓글주소  수정/삭제

      저도 그렇게 생각했는데 ㅋ 스택도 큐의 일부로 생각하나 보더라구요 ㅋ

      원본글을 보아도 이렇게 되어있는 부분입니다. ㅎㅎ