Application Fundamentals
안드로이드 application은 Java 프로그래밍 언어로 작성된다. 컴파일된 Java 코드는 SDK에 존재하는 aapt 유틸리티에 의해 안드로이드 패키지로 묶여지며, 이렇게 하나로 압축된 아카이브(archive) 파일에는 .apk 접미사가 부쳐진다. 이 파일은 모바일 디바이스에 안드로이드 application을 배포하고 설치하기 위한 수단이다.
l 기본적으로 모든 application은 자신의 리눅스 프로세스 내에서 실행된다. 안드로이드는 임의의 application 코드가 실행될 필요가 있을 때 그 프로세스를 시작시키며, 그것이 더 이상 필요치 않고 다른 application이 시스템 자원을 요구할 때 그 프로세스를 종료시킨다.
l 각각의 프로세스는 자기 자신의 Java 가상머신을 가진다. 그러므로 application 코드는 다른 모든 application 코드와는 격리되어 실행된다.
l 각각의 application에는 고유한 리눅스 User ID가 부여된다. Application을 구성하는 파일들은 해당 사용자와 해당 application 그 자신에게만 보여지도록 권한이 설정된다.
두개의 application에 대해 동일한 User ID를 공유할 수 있도록 배치하는 것이 가능하다. 그런 경우에 두 개의 application은 각자 다른 application의 파일을 볼 수 있을 것이다. 시스템 자원을 절약하기 위해 동일한 ID를 가지는 application은 또한 동일한 리눅스 프로세스 안에서 실행되도록 배치되며, 동일한 가상머신을 공유한다.
Application Components
안드로이드의 가장 큰 특징으로는 한 application에서 엘리먼트의 사용을 허가 할 경우 다른 application에서의 사용이 가능하다. 이런 작업을 위해서는 어떤 application의 특정 영역이 필요할 때 시스템은 application 프로세스를 시작할 수 있어야 하고, 그 영역에 대한 Java 오브젝트를 인스턴스화 할 수 있어야 한다. 그러므로 안드로이드 application은 다른 대부분의 시스템에서의 application와 달리 하나의 시작점을 가지지 않는다. 대신 시스템이 그것을 필요로 할 때 인스턴스화하고 실행할 수 있는 기본적인 컴포넌트들이 존재한다.
Activities
액티비티는 사용자가 착수할 수 있는 하나의 포커스 된 시도에 대한 비쥬얼 사용자 인터페이스를 나타낸다. 예를 들어 액티비티는 사용자들이 선택할 수 있는 메뉴 아이템 리스트를 나타내거나 사진과 함께 그것의 캡션을 나타낼 수도 있다.
하나의 application은 단지 한 개의 액티비티로 구성될 수도 있으며, 몇 개의 액티비티를 포함하고 있을 수도 있다.
각각의 액티비티에는 그리기draw가 가능한 하나의 디폴트 윈도우가 부여된다. 하나의 액티비티는 또한 추가적인 윈도우(팝업 Dialog)를 사용할 수 있다.
뷰 계층구조는 Activity.setContentView() 메소드에 의해 액티비티의 윈도우 내에 위치하게 된다. 그 컨텐트뷰는 그 계층구조의 최상위에 있는 뷰 오브젝트이다.
Services
서비스는 사용자에게 보여지는 인터페이스를 가지지 않는다. 하지만 오히려 정해지지 않은 시간동안 백그라운드에서 실행된다. 예를 들어 서비스는 사용자가 다른 일에 주의를 기울이는 동안에 백그라운드 음악을 재생할 수 있다. 또한 그것은 네트워크 상에서 데이터를 가져오거나, 또는 어떤 것을 계산해서 그 결과를 필요로 하는 액티비티에게 제공할 수도 있다.
액티비티와 다른 컴포넌트처럼, 서비스도 application 프로세스의 메인 쓰레드 내에서 실행되므로 서비스가 다른 컴포넌트 또는 사용자 인터페이스에 의해 방해 받지 않도록 하기 위해서 음악 재생같이 시간을 요하는 작업들을 위해서는 종종 또 다른 쓰레드를 만들어서 작동시킨다.
Broadcast receivers
브로드캐스트 리시버는 아무 것도 하지 않는 컴포넌트지만, 브로드캐스트 공지를 수신하고 응답한다. 많은 브로드캐스트는 시스템 코드에서 발생된다.(시간대 변경, 배터리 부족, 사진 촬영, 언어설정 변경 등에 대한 Message 등)
브로드캐스트 리시버는 사용자 인터페이스를 보여주지 않지만 그것이 수신한 정보에 응답하는 액티비티를 시작하거나, 또는 사용자에게 알려주기 위해 노티피케이션 매니저를 사용할 수 있다.
Content providers
컨텐트 프로바이더는 다른 애플리케이션에게 유용한 특정 애플리케이션의 데이터 집합을 만든다. 그 데이터는 파일 시스템 내, SQLite 데이터베이스 내, 또는 의미있는 다른 어떤 방식으로 저장될 수도 있다.
Activating components: intents
컨텐트 프로바이더는 컨텐트 리졸버 요청의 대상이 될 때 활성화된다. 하지만 다른 세 가지 컴포넌트, 즉 액티비티, 서비스, 그리고 브로드캐스트 리시버는 Intent라 불리는 비동기적인 메시지에 의해 활성화된다. Intent는 컨텐트 메시지를 보유하고 있는 Intent 오브젝트다. Intent는 액티비티와 서비스에 대해서, 그것에게 요청되는 액션을 가리키고 그 액션이 처리해야 하는 데이터의 URI를 나머지 다른 것들과 함께 명시한다.
각각의 컴포넌트 타입을 활성화하기 위한 별도의 메소드가 있다.
l 액티비티는 Intent오브젝트를 Context.startActivity() 또는 Activity.startActivityForResult()에 파라미터로 전달함으로써 실행된다. 이것에 응답하는 액티비티는 getIntent() 메소드를 호출함으로써 그것을 실행하도록 한 초기 Intent를 볼 수 있다.
l 하나의 액티비티는 흔히 그 다음번 액티비티를 시작시킨다. 만약 그것이 자신이 시작시킨 액티비티로부터 결과를 리턴받고자 한다면, 그것은 start Activity() 대신에 startActivityForResult()를 호출해야 한다.
l 서비스는 Context.startService()에 Intent오브젝트를 파라미터로 전달함으로써 시작된다.. 안드로이드는 서비스의 onStart() 메소드를 호출하고 그곳에 Intent오브젝트를 전달한다.
l application은 Context.sendBroadcast(), Context.sendOrderedBroadcast(), 그리고 Context.sendStickyBroadcast() 같이 다양하게 변형된 메소드에 Intent오브젝트를 전달함으로써 브로드캐스트broadcast를 만들어낼 수 있다.
Shutting down components
컨텐트 프로바이더는 컨텐트 리졸버의 요청에 응답하는 동안에만 활성화되어 있다. 그리고 브로드캐스트 리시버도 브로드캐스트 메시지에 응답하는 동안에만 활성화되어 있다. 그러므로 이러한 컴포넌트는 명시적으로 종료시켜야 할 필요가 없다. 반면, 액티비티는 사용자 인터페이스를 제공한다. 이것은 사용자와 오랜시간 동안 대화를 하며 활성화 상태로 남아 있다. 심지어는 대화가 지속될 수 있는 한, 그것이 사용되지 않는idle 상태에도 활성화 상태로 남는다.
l 액티비티는 finish() 메소드의 호출을 통해 스스로 종료될 수 있다. 그리고 finishActivity()를 호출함으로써, 다른 액티비티를 종료시킬 수도 있다.
l 서비스는 stopSelf() 메소드의 호출이나 Context.stopService()를 호출함으로써 종료될 수 있다.
또한, 컴포넌트는 그것이 더 이상 사용되지 않을 때, 또는 안드로이드가 더 많은 활성화된 컴포넌트를 위해 메모리를 회수해야 할 때 시스템에 의해 종료될 수 있다.
The manifest file
안드로이드는 애플리케이션의 컴포넌트를 시작하기 전에, 컴포넌트의 존재를 인식해야 한다. 그러므로 애플리케이션은 매니페스트 파일에 그것들의 컴포넌트를 선언한다. 그리고 그 매니페스트 파일은 안드로이드 패키지, .apk 파일 내에 포함된다. 이 패키지는 애플리케이션의 코드, 파일, 리소스 또한 보유하고 있다.
그러나 매니페스트의 주요한 작업은 안드로이드에게 application의 컴포넌트를 알려주는 것이다.
Intent filters
Intent 오브젝트는 그것의 대상이 되는 컴포넌트를 명시적으로 지정할 수 있다. 만약 그렇다면, 안드로이드는 (매니페스트 파일 내의 선언들에 기초해서) 그 컴포넌트를 찾아 내고 그것을 활성화한다. 하지만 타겟이 명시적으로 지정되지 않으면, 안드로이드는 Intent를 처리할 수 있는 최선의 컴포넌트를 찾아내야 한다. 이것은 해당 Intent 오브젝트와 그 Intent의 잠재적 대상이 될 수 있는 컴포넌트들의 Intent 필터를 비교함으로써 이루어진다. 컴포넌트의 Intent 필터는 안드로이드에게 해당 컴포넌트가 처리할 수 있는 Intent의 종류를 알려준다. 컴포넌트에 대한 다른 필수적인 정보들처럼, Intent 필터도 매니페스트 파일 내에 선언된다.
컴포넌트는 인텐트 필터를 얼마든지 가질 수 있다. 그리고 각각의 필터는 각기 다른 능력capability을 선언할 수 있다. 만약 컴포넌트가 어떤 필터도 가지지 않는다면, 그것은 인텐트의 대상으로 컴포넌트를 명시적으로 지정하는 인텐트에 의해서만 활성화될 수 있다.
코드 내에서 생성되어 등록된 브로드캐스트 리시버에 있어서, 인텐트 필터는 IntentFilter 오브젝트에 의해 직접적으로 인스턴스화 된다. 나머지 모든 필터들은 매니페스트 내에서 설정된다.
참고 문서 : http://developer.android.com/guide/topics/fundamentals.html