2010년 10월 26일 화요일

애플리케이션 기본 개념

- 안드로이드 애플리케이션 프레임웍

     android.*: 안드로이드 응용프로그램 기본요소
     com.google.android.maps: Google 지도 인터페이스(API 키 필요)
     dalvik.*: 디버깅 등을 위한 Dalvik 가상기계 지원
     java.*: 핵심 클래스들과 네트워킹,보안,수학 등을 위한 일반 유틸리티
     javax.*: 암호화 지원
     junit.*: 단위검사 지원
     org.apache.http.*: HTTP 프로토콜 지원
     org.json: JSON(JavaScript Object Notation) 지원
     org.w3c.com: DOM 코어(XML, HTML)을 위한 W3C Java 바인딩
     org.xml.sax.*: XML 지원을 위한 SAX(Simple API for XML)
     org.xmlpull.*: 고성능 XML 파싱


- 안드로이드 개발도구

에뮬레이터: 컴퓨터상에서 스마트폰의 행태를 구현해 놓은 것이 에뮬레이터이며, SDK 설치후 마지막으로 띄운 것이다.

Dalvik 디버그 모니터 서비스(DDMS): 안드로이드 기기(에뮬레이터든 실제 하드웨어이든)에 접근해서 프로세스,스레드,힘,프로세스를 디버거에 붙이는 등의 작업이 가능.

안드로이드 디버그 브리지(ADB): JDK, 디버거와 기기(또는 에뮬레이터)간의 브리지 개념이다.  DDMS와 안드로이드 플러그인 모두 이 ADB를 통해 기기와 상호작용한다. 스트레스 테스트를 위한 Application Exerciser Monkey, 로깅시스템(logcat) 등의 기능도 지원한다.

패키징 도구(aapt: Android Asset Packaging Tool)

Draw Nine-patch: 9x9 PNG 이미지 생성

- 안드로이드 기본 구동원리

안드로이드 애플리케이션은 자바 언어로 작성된다. 컴파일된 자바 코드-애플리케이션에 필요한 데이터와 리소스 파일과 함께-는 aapt 툴로 묶여서 안드로이드 패키지(.apk로 끝나는 아카이브 파일)가 된다. 이 파일이 애플리케이션을 배포하고 이동 기기에 설치하는 수단이다; 사용자는 이 파일을 기기에 다운로드한다. 하나의 .apk 파일에 있는 모든 코드를 하나의 애플리케이션으로 간주한다.

다음과 같은 여러 면에서 각 안드로이드 애플리케이션은 자신만의 세계를 가지고 있다:
• 모든 애플리케이션은 자신만의 리눅스 프로세스에서 실행된다. 안드로이드는 애플리케이션 코드가 실행될 필요가 있을 때 프로세스를 시작하고, 더이상 필요하지 않거나 다른 애플리케이션이 시스템 자원을 필요로 할 때 그 프로세스를 끝낸다.
• 각 프로세스는 자신만의 자바 가상머신을 갖고 있어서, 애플리케이션은 다른 애플리케이션 코드와는 독립된 상태로 실행된다.
• 디폴트로, 각 애플리케이션은 고유한 리눅스 사용자 ID를 갖고 있다. 그 사용자, 즉 그 애플리케이션만이 애플리케이션을 볼 수 있는 퍼미션을 가진다--하지만 권한을 다른 애플리케이션에 줄 수 있는 수단도 있다. 두 애플리케이션이 같은 사용자 ID를 갖는 것이 가능하며, 그 경우 서로의 파일을 볼 수 있다. 시스템 리소스의 측면에서는, 같은 ID를 가진 애플리케이션이 같은 리눅스 프로세스를 써서 같은 VM을 공유할 수도 있다.


애플리케이션의 기본 개념을 구성하는 핵심 요소는 다음과 같은 네 가지가 있다.

- 애플리케이션 컴포넌트

시스템이 실행할 수 있는 컴포넌트는 다음과 같다.

액티비티: 단말기 화면에 보여지는 사용자 인터페이스. 보통 Activity 클래스의 서브클래스로 작성한다.

서비스: 화면에 나타나지 않고 지정된 시간 동안 백그라운드에서 실행된다. Service 클래스의 서브클래스로 작성한다.

브로드캐스트 수신자: 외부의 방송을 수신하고 그에 반응하는 작업을 한다. 대부분 방송 송신은 시스템 코드-예를 들면 시간대역 변경, 배터리 낮음, 사진 찍혔음 등-에서 발생한다. 모든 수신자는 BroadcastReceiver 클래스의 서브클래스로 작성한다.

컨텐트 제공자: 애플리케이션 데이터를 다른 애플리케이션이 사용할 수 있도록 한다. 데이터는 파일시스템, SQLite 데이터베이스 또는 다른 저장소에 저장되어 있을 수 있다. ContentProvider 클래스로 제공할 데이터를 정의하고, ContentResolver 클래스로 제공자가 제공하는 자료를 받는다.

- 액티비티와 태스크

태스크는 사용자가 애플리케이션이라고 생각하는 것이다. 이 태스크는 연결되어서 스택에 정렬된 액티비티의 집합이다. 스택상의 루트 액티비티는 태스크를 시작한 액티비티-보통 사용자가 애플리케이션 론처에서 실행한 액티비티-이다. 스택의 최상위에 있는 액티비티는 사용자가 현재 사용하는 액티비티이다. 실행 중인 액티비티가 새로운 액티비티를 실행시키면, 새로운 액티비티가 스택에 들어간다. 이전 액티비티는 스택에 남아 있다. 이 상황에서 사용자가 BACK 키를 누르면, 현재 액티비티는 스택에서 튀어나가고, 이전 액티비티가 다시 실행 액티비티가 된다.
앞서 설명한 것이 액티비티와 태스크의 기본 작동방식이다. 하지만 그 방식의 거의 모든 부분을 변경할 수 있다. 태스크와 액티비티의 연관관계, 태스크 내에서 액티비티의 행동방식은 액티비티를 시작시킨 인텐트 객체와 매티페스트에 있는 그 액티비티의 <activity> 엘리먼트에 설정된 속성간의 상호작용에 의해 제어된다. 따라서 요청자나 응답자나 일어나는 일에 관여할 수 있다.

주요 인텐트 플래그로는:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP

주요<activity> 속성으로는:
taskAffinity
launchMode
allowTaskReparenting
clearTaskOnLaunch
alwaysRetainTaskState
finishOnTaskLaunch

등이 있다. 이들 플래그와 속성이 무엇을 하는지, 어떻게 상호작용하는지, 고려사항은 어떤 것이 있는지는 다음 장에서 설명한다.

- 프로세스와 쓰레드

애플리케이션의 첫 번째 컴포넌트가 실행될 때, 안드로이드는 하나의 쓰레드에서 하나의 리눅스 프로세스를 실행시킨다. 디폴트로, 모든 컴포넌트는 그 프로세스와 쓰레드에서 실행된다.
그러나, 컴포넌트가 서로 다른 프로세스에서 실행되고, 특정 프로세스가 추가된 쓰레드에서 실행되도록 할 수 있다.

- 컴포넌트 생명 주기
애플리케이션 컴포넌트는 생명주기를 갖고 있다--인텐트에 반응하여 안드로이드 인스턴스가 생성될 때 시작하여 인스턴스가 소멸될 때 종료된다. 그 사이에, 활성-비활성 상태를 오가며, 액티비티인 경우 화면에 나타나고 사라지는 상태를 반복한다. 이런 생명주기를 갖는 컴포넌트는 액티비티, 서비스, 브로드캐스트 수신자 등이 있다.

생명주기 다이어그램은 다음과 같다.(http://developer.android.com 참조)

댓글 없음:

댓글 쓰기