맞춤검색
2009.03.10 16:16

[펌]안드로이드 어플리케이션의 구조

출처 : http://cafe.naver.com/androidwave

◆ 안드로이드 애플리케이션 구조
안드로이드 애플리케이션은 Activity, Intend Receiver, Service, Content Provider 이 4가지로 구성되어 있다. 모든 애플리케이션이 이 4가지를 다 필요로 하지 않으며, 이들의 조합으로 이루어진다.
애플리케이션에서 어떤 컴포넌트들을 사용할지 결정하였다면 이 컴포넌트들의 목록을 AndroidManifest.xml 파일에 기록해야 한다. 이 xml 파일은 어느 애플리케이션에서 이 컴포넌트들을 선언했는지, 그들의 기능과 요구사항은 무엇인지를 기록하는 파일이다. 추후에 이 파일에 대해 자세하게 설명하도록 하겠다.


◆  Activity
Activity는 애플리케이션에서 하나의 화면을 지칭한다. 각 Activity는 Activity base class를 상속하여 구현한 하나의 클래스이며, 사용자에게 View와 event 응답으로 이루어진 인터페이스를 화면상에 보여줄 것이다. 예를들어 텍스트 메시징 애플리케이션은 첫 화면에서 contact의 목록을 보여줄 것이고, 두번째 화면에서는 선택한 contact에게 메시지를 쓸 수 있도록 하고, 나머지 화면에서는 보낸 메시지를 확인하거나 환경설정을 바꾸는 화면이 될 것이다. 이러한 화면이 Activity가 되며, 다른 화면으로의 이동은 새로운 Activity를 시작하는 것과 같다. 어떤 상황에서는 Activity가 이전의 Activity로 값을 보내줄 수도 있다. 예를 들면 사용자가 사진을 선택했을 경우를 이전의 Activity에 선택한 사진을 보내주는 것과 같은 것이다.
화면이 오픈되면, 이전 화면은 멈추게 되며, history stack에 저장된다. 사용자는 history내에 있는 이전 화면으로 돌아갈 수 있다. 화면들은 history stack내에 저장될 필요가 없는 경우 삭제될 수 있으며, 안드로이드는 이 history stack을 home screen으로부터 실행시킨 각 애플리케이션마다 유지하게 된다.


* Intent와 Intent Filter
안드로이드는 화면과 화면 사이를 이동할 때, Intent라는 특별한 클래스를 사용한다. Intent는 애플리케이션이 무엇을 하기를 원하는지에 대한 정보를 담고 있다. Intent의 가장 중요한 부분은 action과 data가 어떤 동작을 할 것인지에 대한 자료구조이다. action의 일반적인 값은 MAIN(activity의 시작점), VIEW, PICK, EDIT 등등이며, 데이터는 URI로 표현된다. 예를들어, 어떤 사람의 연락처를 보려고 할 때 VIEW action에 대한 intent를 생성하고 그 사람을 표현하는 URI data를 만들어 VIEW action 데이터로 지정해주면 된다.
이와 관련한 클래스로는 IntentFilter가 있다. Intent가 어떤 작업에 대한 요청이라면 IntentFilter는 Activity(또는 아래에 설명될 Intent Receiver)상의 Intent를 핸들링 할 수 있는지를 표현하는 것이다. 예를 들어, 어떤 사람에 대한 연락처를 보여줄 수 있는 Activity가 사람에 대한 정보를 표현하는 데이터에 적용될 때 VIEW 액션을 핸들링 할 수 있는 IntentFilter를 생성한다. 또한 Activity는 AndroidManifest.xml 파일에 기록된 IntentFilter를 생성한다.
화면과 화면 사이를 네비게이션 하는 것은 Intent를 해석하는 것으로 동작된다. 앞으로(forward) 네비게이션 하려면 Activity는 startActivity(myIntent)를 호출하고, 그 다음에 시스템은 애플리케이션에 설정된 모든 IntentFilter를 검사하고, myIntent와 가장 일치하는 IntentFilter를 가진 Activity를 가져오며, 이  Activity의 시작을 Intent로부터 통보받는다. Intent 해석 과정은 startActivity가 호출될 때 런타임으로 일어난다. 이러한 과정은 아래의 두 가지 장점을 지닌다.

(1) Activity는 다른 컴포넌트들이 간단하게 Intent를 요청하는 것만으로 간단하게 재사용 가능.
(2) 동일한 IntentFilter를 가진 새로운 Activity로 Acitivity는 언제든지 교체 가능..


◆ Intent Receiver
IntentReceiver는 작성한 애플리케이션 코드내에서 핸드폰에 통화가 걸려오거나, 데이터 네트워크 접속이 활성화되는 것과 같은 외부 이벤트를 처리하는데 사용된다. IntentReceiver는 UI를 그려주는 것은 아니고, NotificationManager를 이용하여 사용자에게 어떤 일이 발생했다는 것을 알려준다. IntentReceiver도 AndroidManifest.xml 파일에 등록되지만, Context.registerReceiver()를 이용하여 코드상에서 등록해줄 수도 있다. 애플리케이션이 호출되어야 하는 자신의 IntentReceiver에 의해 실행할 수 없을 때는 IntentReceiver가 트리거 되면 필요에 따라 시스템이 애플리케이션을 실행한다. 또한 애플리케이션은 Context.bradcastIntent()를 호출하여 자신의 Intent를 다른 애플리케이션에 broadcast할 수 있다.


◆  Service
Service는 UI와 상관없이 아주 오랫동안 존재하며 실행되는 코드이다. 예를 들면 재생목록에서 노래를 재생하는 미디어 플레이어 같은 것이다. 미디어 플레이어 애플리케이션은 사용자가 곡을 선택하고 재생을 시작하게 하는 하나 이상의 Activity를 가지고 있지만, 스스로 음악 재생을 하는 것은 Activity에 의해 실행되는 것은 아니다. 사용자는 새로운 화면으로 이동하고 나서도 음악을 계속 재생하기를 기대하기 때문이다. 이런 상황에서 미디어 플레이어의 Activity는 Context.startService()를 이용하면 Service로 실행된다. 시스템은 음악 재생 서비스를 멈출때까지 계속 재생할 것이다. Context.bindService() 메소드는 서비스에 연결하거나 아직 시작하지 않은 Service를 시작한다. Service에 연결이 되면 Service에 접근가능한 인터페이스를 통해 멈춤, 다시 재생등을 할 수 있도록 접근이 가능하다.


◆  Content Provider
애플리케이션은 자신의,데이터를 SQLite 데이터베이스 또는 다른 방법으로 파일에 저장할 수 있다. ContentProvider는 애플리케이션 데이터가 다른 애플리케이션과 공유할 필요가 있을 때 아주 유용하다. 이 클래스는 다른 애플리케이션이 데이터를 저장하거나, 가져오는 것과 같은 작업을 할 수 있도록 해준다.

위의 구조와 관련한 것은 다음에 더 자세히 다루고, 실제로 모든 과정을 거치는 코드를 작성해보도록 하자. 아래의 샘플 코드를 1~3을 따라해보면 위에서 언급한 안드로이드 구조를 이해할 수 있다.

Trackback 0 Comment 0


티스토리 툴바