직전 포스팅에서 짤막하게 언급했듯이 안드로이드에는 4대 컴포넌트가 있다.
- Activity : 액티비티
- Service : 서비스
- Broadcast Receiver (BR) : 방송 수신자
- Content Provider (CP) : 콘텐츠 제공자
각 컴포넌트는 하나의 독립적인 형태로 존재하며 고유의 기능을 수행한다. 하나의 컴포넌트에서 다른 컴포넌트를 호출할 때는 인텐트를 거쳐야 하기 때문에 컴토넌트들이 인텐트를 통해 상호작용 한다.
Activity
액티비티는 UI 화면을 담당한다. 그래서 안드로이드 앱을 만들 때 나머지 3개의 컴포넌트들과 달리 액티비티는 반드시 하나 이상 있어야 한다. Activity 클래스를 상속받아 생명주기 관련 메소드들을 재정의하여 원하는 기능을 구현한다.
- 인텐트를 통해 다른 어플리케이션 액티비티 호출 가능
- 두 개 이상 액티비티를 동시에 Display 불가
- 하나 이상의 View나 ViewGroup 포함
- 액티비티 내 Fragment를 추가하여 화면 분할 가능
Service
서비스는 백그라운드에서 실행되는 프로세스를 의미하기 때문에 화면이 존재하지 않는다. 그래서 종종 별도의 쓰레드에서 동작한다고 생각하는 사람들이 많다고 한다. 하지만 엄연히 메인 쓰레드에서 동작하니까 별도의 쓰레드를 생성하여 작업해야 한다.
- 네트워크와 연동 가능
- Service 클래스를 상속받아 사용
- 서비스를 시작하면 앱이 종료되어도 백그라운드에서 계속 동작
Broadcast Receiver
방송 수신자는 안드로이에서 발생하는 다양한 이벤트와 정보를 받아와 반응한다. 메시지를 여러 객체에 전달하는 것을 broadcasting
이라고 하는데, 브래드캐스트 리시버를 구현하여 해당 정보가 왔을 때 특정한 이벤트를 처리해주는 방식으로 사용한다.
- 대부분 UI 존재 X
- 리시버를 통해 디바이스의 상황을 감지하고 작업 수행
Content Provider
콘텐츠 제공자는 데이터를 관리하고 다른 어플리케이션 데이터를 제공해준다. 주로 DB를 공유하기 위해 사용되며 생명주기를 갖고 있지 않다.
CRUD
원칙 준수- ContentProvider 클래스를 상속받아 사용
- 데이터의 읽기 / 쓰기에 대한 권한이 있어야 데이터 접근 가능
그렇다면 이러한 컴포넌트들을 상호작용할 수 있도록 도와주는 인텐트는 도대체 뭘까?
Intent
인텐트는 컴포넌트 간 정보를 전달하는 일종의 통신 수단이다. 액티비티 간 화면 전환 시 많이 사용한다.
인텐트는 액션(수행할 기능)과 데이터(액션이 수행될 대상)로 구성되며 두 종류로 나뉜다.
-
명시적 인텐트 (Explicit intent)
- 특정 컴포넌트나 액티비티가 명확하게 실행되어야 할 때 사용
- 클래스 객체나 컴포넌트 이름을 지정하여 호출할 대상을 확실히 알 수 있는 경우
- 주로 어플리케이션 내부에서 사용
-
암시적 인텐트 (Implicit intent)
- 호출할 대상이 달라질 수 있는 경우에 사용
- 기존에 특정 기능을 지원하는 앱이 있는 경우 암시적 인텐트를 이용하면 해당 앱 사용 가능