개발의 기초
Android 어플리케이션은 모두 Java 언어로 기술되어 있습니다. 컴파일이 끝난 Java 코드
(및 그 어플리케이션에 필요한 모든 데이터랑 리소스 파일) 는, aapt툴을 이용해서
Android 패키지에
핸들합니다. Android 패키지는,확장자가.apk인 활성화 파일 입니다.
유저는 그 파일을 장치에 다운로드해서 이용 합니다.즉 Android 패키지는 어플리케이션을 모바일 장치에 배포 및 인스톨 하기 위한 매체로서 작동합니다.
하나의.apk파일에 포함되어 있는
모든 코드가 하나의 어플리케이션으로 보여지게 됩니다.
각 Android 어플리케이션은 아래의 여러가지 방법으로 다른 어플리케이션으로 부터 격리 됩니다.
- 모든 어플리케이션은 디폴트에서 그 어플리케이션 개별의 Linux 프로세스로 실행됩니다.
- Android는 어플리케이션 코드 실행이 필요할때 프로세스를 개시하고 필요가 없을땐 다른 어플리케이션이 시스템 리소스를 요구 할 경우만 프로세스를 종료 합니다.
- 프로세스 마다 전용의 Java 가상머신(VM)이 할당되기 때문에 어플리케이션 코드는 다른 어플리케이션으로 부터 격리된 상태로 실행 됩니다.
- 디폴트에서는 어플리케이션마다 고유의 Linux 사용자 ID가 할당됩니다.
권한이 설정되어 있기 때문에 어플리케이션 파일은 그 사용자 말고는 인식할 수 없고 그 어플리케이션 자체에서만 이용할 수 있습니다. 다만 파일을 다른 어플리케이션에 export하는 것은 가능합니다.
두개의 어플리케이션에서 같은 사용자ID를 공유하는것도 가능 합니다.
그 경우 각각의 어플리케이션 파일을 서로 서로 인식할 수 있습니다.
시스템 리소스를 절약하기 위해 같은 ID어플리케이션에서 같은 VM을 공유하며 같은 Linux 프로세스에서 실행 하는 것도 가능 합니다.
어플리케이션 콤포넌트
Android 의 큰 특징의 하나는 허가만 되어 있으면 어떤 어플리케이션이 다른 어플리케이션의 요소를 이용 할 수있다는 점 입니다. 예를 들어 개발 중의 어플리케이션에서 이미지 리스트를 스크롤 방식으로 표시하고 싶을 경우 다른 어플리케이션의 개발이 끝난 적절한 스크롤이 있어 그 이용이 허가되어 있다면 독자적으로 개발하지 않아도 스크롤을 이용할 수있습니다. 어플리케이션에 다른 어플리케이션 코드를 삽입
(통합)하거나 링크를 설정하거나 할 필요가 없습니다. 필요할때 다른 어플리케이션의 일부분을 사용할 뿐입니다.
이 방법이 기능하기 위해서는 어플리케이션 프로세스 일부분을 필요에 따라 사용할수있고 그 부분의 Java 오브젝트를 인스턴스화 할 수 있어야 합니다. 그때문에 Android 어플리케이션에는 다른 시스템에서 동작하는 단일 엔트리 포인트 즉, 어플리케이션에서 자주 사용되어지는 어플리케이션 전체에 접근 하기위한 main()과 같은
함수는 없습니다. 대신에 시스템이 필요에 따라 인스턴스화해서 실행 할수 있는 컴포넌트로 구성 됩니다. 컴포넌트에는 아래의 4가지 타입이 있습니다.
- Activity
Activity는 사용자가 하나의 조작을 집중적으로 실시하기 위한 시각적인 사용자 인터페이스를 나타냅니다. 예를 들어 사용자가 아이템을 선택할 수 있는 메뉴 아이템 리스트를 표시하는 Activity , 사진에 캡션을 붙여서 표시하는 Activity 등을 예로 들 수 있습니다.
SMS 어플리케이션이라면 어떤 Activity 에선 메세지를 수신하는 연락처 리스트를 표시하고 또 다른 Activity 에선 선택한 연락처에 메세지를 입력하고 그 외의 Activity 에선 예전 메세지를 참조하거나 설정을 변경 하거나 할 수 있습니다. 다만 이들 Activity 를 조합해서 전체로서 사용자 인터페이스를 형성하더라도 각각의 Activity 는 서로 서로 독립해 있습니다.
각 Activity 는Activity
기본 클래스의 서브클래스로서 실시됩니다.어플리케이션은 하나의 Activity 로 구성하거나 상기의 SMS 어플리케이션처럼 복수의 Activity 로 구성 하는것도 가능 합니다. 어떤 Activity 가 몇 개 필요한지는 어플리케이션 설계에 따라 달라집니다. 통상적으로는 Activity 중에 어느 하나를 최적 Activity 로 지정하고, 사용자가 어플리케이션을 기동했을때 표시 합니다.
어느 Activity 로부터 다른 Activity 로 이동 한다는것은 현재 Activity가 다음의 Activity 를 개시함을 의미합니다.각 Activity 에는 그것을 표시하기위해 디폴트 윈도우가 할당되어 있습니다.
통상은 윈도우를 화면 전체에 표시합니다만 작은 윈도우를 다른 위도우의 전면에 표시하는것도 가능합니다. Activity 로 새로운 윈도우를 추가하는 것도 가능 합니다. 예를들어 Activity 도중에 사용자에게 응답을 요구하는 팝업 다이얼로그를 표시하거나 사용자가 화면상의 특정 아이템을 선택했을때에 다른 윈도우에서 중요한 정보를 표시하거나 할 수있습니다.윈도우의 시각적인 컨텐츠는 뷰(
View
기본 클래스의 파생 오브젝트)의 계층으로서 제공됩니다.
각 뷰는 윈도우 내의 특정의 구형 영역을 제어합니다. 부모 뷰는 자식이 되는 뷰를 구성하고 그들 자식 뷰의 레이아웃을 결정합니다. 리프(잎:자료구조 참고)뷰(계층 최하단에 위치하는 뷰)는 그 뷰가 제어하는 구형 영역에 표시되어 그 영역에서 사용자의 액션에 대해 응답 합니다. 즉 뷰는 Activity 와 사용자가 대화하는 장소입니다. 예로 뷰에 작은 이미지를 표시하고 사용자가 그 이미지를 탭하면 무언가의 액션을 시작하는것도 가능 합니다. Android 에서는 버튼,텍스트 필드,스크롤바,메뉴아이템,체크 박스등 여러가지 뷰가 미리 준비되어 있습니다.뷰 계층은
메소드를 이용해서 Activity 윈도우내에 배치 합니다.Activity.setContentView()
컨텐츠 뷰 계층의 루트가 되는 View 오브젝트 입니다.- 서비스
서비스는 시각적인 사용자 인터페이스를 가지지 않고 백그라운드에 두고 명확한 종료의 사이클이 없이 실행됩니다. 예를들면 사용자가 다른 조작을 하고 있는 사이 BGM을 재생하는 서비스,네트워크 경유로 데이터를 패치하는 서비스 먼가를 계산하고 그 결과를 Activity 로 제공하는 서비스등을 들수있습니다. 각 서비스는
Service
기본 글래스의 확장입니다.전형적인 예로써 Play List에있는 곡을 재생하는 미디어 플레이어를 들 수 있습니다.
플래이어 어플리케이션은 사용자가 곡을 선택하고 재생하기 때문에 하나 이상의 엑티비티로 구성할거라 생각하지만 사용자가 플레이어를 숨기고 다른 조작으로 옮긴 후에도 계속 듣고 싶은 생각에 곡의 재생 자체를 엑티비티로 처리할 수는 없습니다.음악 재생을 하는 미디어 플레이어 Activity 에서 백그라운드에서 실행하는 서비스를 개시합니다.
음악 재생 서비스는 개시한 Activity를 화면상에서 보여지지 않게 되어도 그대로 계속 실행합니다.
또 실행중 서비스에 접속하는것도 가능합니다.( 실행되어 있지 않을 경우엔 그 서비스를 개시하는 것도 가능 합니다.) 접속중은 서비스가 공개하고 있는 인터페이스를 사용해서 서비스와 대화할 수 있습니다. 음악 재생 서비스가 실행하고 있다면 인터페이스를 사용해서 일시 중지,돌려감기,중지,재생 전개등의 조작을 실행 할 수 있습니다.Activity 그리고 다른 컴포넌트와 동일하게 서비스도 어플리케이션 프로세스 메인 스레드에서 실행합니다.따라서 서비스가 다른 컴포넌트와 사용자 인터페이스 실행을 방해하는일은 없습니다.
시간이 걸리는 태스크(예로 음악 재생)에대해서는 통상은 다른 스레드를 생성해서 처리 합니다.- 브로드 캐스트 리시버
- 브로드 캐스트 리시버는 브로드 캐스트를 수신하는 브로드 캐스트 대상 컴포넌트 입니다.
- 브로드 캐스트의 대부분이 원래는 시스템 코드로 타임존이 변경됐을때,전지의 잔량이 적어졌을때,
사진이 촬영 됐을때,사용자가 언어 설정을 변경 했을때등을 알려주기 위해 사용 합니다. - 어플리케이션이라도 예를 들어 데이터가 장치에 다운로드되어 이용 할 수 있게 된것을 다른 어플리케이션에 브로드 캐스트로 알려주는 것이 가능 합니다.
- 어플리케이션에서는, 중요하다고 생각되는 모든 연락에 대응할 수 있도록 브로드 캐스트 리시버를 몇개라도
설정 가능합니다. 모든 리시버는BroadcastReceiver
기본 클래스를 확장합니다. - 브로드 캐스트 리시버가 사용자 인터페이스를 표시하는 일은 없습니다.
다만, 수신한 정보의 대응으로써 Activity 를 개시하거나,NotificationManager
를 사용해서 사용자 알림을
송신하거나 하는 일은 있습니다.
알림시에는 백 라이트를 점멸시키는 바이브레이션을 기동하거나 음을 울리는등의 여러가지 방법으로 사용자에게 알림을 줄 수있습니다.
통상은 상태바로 영속 아이콘을 표시하고, 사용자가 이것을 듣고 메세지를 취득 하도록 합니다. - 컨텐츠 프로바이더
- 컨텐츠 프로바이터는 어플리케이션의 데이터를 다른 어플리케이션에서도 이용 할 수있도록 합니다.
데이터는 파일 시스템 및 SQLite 데이터 베이스등의 일반적으로 이용 할 수있는 방법으로 격납되어져 있으면
사용 할 수 있습니다. 컨텐츠 프로바이더는ContentProvider
기본 클래스를 확장 합니다.
프로바이더가 제어하는 형태의 데이터를 다른 어플리케이션으로 부터 취득 혹은 격납하기 위해 표준 메소드 셋을 실시 하고 있습니다. 다만 이들 메소드를 어플리케이션으로 부터 직접 호출 하는것은 안됩니다.
대신에ContentResolver
오브젝트의 메소드를 호출 합니다.
ContentResolver는 모든 프로바이더와 통신할 수 있고 프로바이더와 연락해서 관련 있는 모든 프로세스 사이 의 통신을 관리 합니다.
Android에서는 특정 컴포넌트에서 처리해야하는 요청이 있으면 그 컴포넌트의 어플리케이션 프로세스가 실행중인지 아닌지를 확인 (필요에 따라서 프로세스를 개시) 하고, 그 컴포넌트의 적절한 인스턴스를
이용 할 수 있는지 없는지를 확인 (필요에 따라서 인스턴스를 작성) 합니다.컴포넌트의 액티브화: Intent
컨텐츠 프로바이더는 ContentResolver로 부터 요청 대상이 되면 활성화 됩니다.
그외 3가지의 컨포넌트 ( Activity , 서비스, 브로드 캐스트 리시버 ) 는 , Intent 로 불려지는 비동기
메세지에의해 활성화 됩니다. Intent 는 메세지 컨텐츠를 보유하는Intent
오브젝트 입니다.
Activity 와 서비스의 경우 Intent 오브젝트의 주 역할은 요청 되어진 액션을 지명하고 그 대상이
되는 데이터의 URI을 지정하는것 입니다.
예를 들어 사용자는 이미지를 표시하기 위한 요청 및 텍스트를 편집시키는 요청을 Activity 에 전달할 수있습니다. 브로드 캐스트 리시버의 경우는 Intent오브젝트가 지금 부터 알림을 실시하는 액션을 지명합니다. 예를 들어 카메라 버튼이 눌려진것을 관련 있는 브로드 캐스트 리시버에 통지할 수 있습니다.아래 컴포넌트 타입마다 각각의 활성화 메소드가 준비되어 있습니다.
액티비티를 기동하는 (또는 무언가 새로운 처리를 실행 시키는)Intent 오브젝트를
또는Context.startActivity()
에 전달합니다.Activity.startActivityForResult()
응답 엑티비티로
메소드를 호출합니다. 최초 그 엑티비티가 기동됐을때의getIntent()
Intent 의 내용을 확인 할 수 있습니다.
Android에 의해서 Activity
메소드가 호출되어, Activity 를 이후에 접속onNewIntent()
되는 Intent 에 전달합니다. 많은 경우 Activity 로 부터 다음의 Activity 을 개시합니다.
개시하는 Activity 로 부터 결과를 넘기는 경우는startActivity()가 아니라
startActivityForResult()을 호출합니다.
예를들어 사용자는 사진을 선택하는
Activity 를 사용할 경우 사용자에 의해 선택된 사진을 넘겨줄지도 모릅니다.
결과는 호출쪽의 엑티비티
메소드에 전달한 Intent 오브젝트에서onActivityResult()
반환합니다.
'나는 엔지니어 > 안드로이드' 카테고리의 다른 글
Application Fundamentals (2) (0) | 2012.06.07 |
---|---|
Android란? (0) | 2012.05.29 |
안드로이드 정리를 시작하며. (0) | 2012.05.29 |