안드로이드란?
리눅스 커널을 기반으로 구글에서 제작하고 있는 모바일 운영체제와 미들웨어 및 중요 애플리케이션이 포함된 소프트웨어 집합이다.
Android 앱은 Kotlin, Java, C++ 언어를 사용하여 작성할 수 있다. 각 안드로이드 맵은 자체적인 보안 샌드박스에 속하며, 멀티유저 Linux 시스템, 고유한 Linux ID 할당, 자체적인 가상 머신, 앱 자체의 Linux 프로세스에서의 실행 등 최소 권한의 원리를 구현한다.
이보다 더 자세한 정보들은 안드로이드 개발자 페이지 를 참고할 것. 이 포스트에서는 안드로이드 앱을 구성하는 핵심 프레이워크 구성요소에 대해 서술한다.
안드로이드의 4대 구성 요소
컴포넌트는 구성 요소라는 뜻을 지니고 있다. 다시 말해, 안드로이드 컴포넌트는 안드로이드 앱을 구성하는데 필요한 4개의 요소를 의미한다. 액티비티((Activity), 서비스(Service), 방송 수신자(BroadCast Receiver), 컨텐츠 제공자(Contnet Provider) 총 4개의 컴포넌트는 독립적인 형태로 존재하며, 고유한 기능을 수행하고 인텐트(Intent)를 통해 상호작용 한다.
0) 인텐트(Intent)
애플리케이션 컴포넌트 간에 작업 수행을 위한 정보를 전달한다.(=통신 수단) 인텐트를 가장 많이 사용하는 예는 액티비티 간의 화면 전환(이동)이 있다. A가 B를 호출할 때 필요한 정보를 가지고 있고, 이 정보에는 호출 대상이 되는 컴포넌트 B의 이름과 속성이 각각 명시적, 암시적으로 표시된다. 호출된 B가 A에게 결과를 전달할 때도 인텐드가 사용된다.
- 독립적으로 동작하는 4개지 대표 컴포넌트 간의 상호 통신을 지원한다.
- 각 컴포넌트에 액션과 데이터 등을 전달한다.
- 인텐트를 통해 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있다.
1) 액티비티(Activity)
액티비티는 사용자가 애플리케이션과 상호작용하는 단일화면을 의미한다. 모든 안드로이드 애플리케이션은 액티비티로 구성되어 있으며, 사용자와 상호작용하는 인터페이스이다. 액티비티는 생명 주기(Life Cycle) 관련 메소드들을 재정의하여 원하는 기능을 구현할 수 있다.
- 사용자가 Application과 상호작용하며, 실제로 사용자에게 보이는 화면.(잠금화면, 로그인화면, 게임화면 등. 전원을 끄거나 폴더를 닫으면 실행되지 않는 게 원칙이다)
- Application에 화면이 없으면 사용자와 상호작용할 수 없으므로 적어도 하나의 액티비티는 필요하다.
- 다른 Application의 약티비티 역시 인텐트를 통해 불리울 수 있다.
- 하나 이상의 view, viewGroup을 포함한다.
- 액티비티 내에 Fragment(프래그먼트)를 추가하여 화면을 분할시킬 수 있다.
- Application이 프로세스를 종료하도록 도와 이전 상태가 복원되는 동시에 사용자가 액티비티로 돌아갈 수 있게 한다.
Fragment: 안드로이드 생태계가 넓어지고 모바일 환경이 크게 변하면서 한 화면 내에서 많은 정보를 표현하기 위해화면 분할 및 Activity끼리 분할된 컨텐츠를 재사용할 수 있게 해주는 요소이다.
초창기에는 없던 개념이며 시스템 또는 앱의 진입점(엔트리 포인트)이 되기 때문에 주요 컴포넌트이긴 하나, 독립성을 띄는 다른 대표 컴포넌트보다는 Activity에 대한 의존성이 짙어 4대 구성요소 +a로 보면 이해가 쉽니다.
//주관적 해석이 들어가 정확하지 않을 수 있다.
2) 서비스(Service)
사용자와 직접적으로 상호작용하는 요소는 아니다. 백그라운드에서 어떠한 작업을 처리하기 위해 사용되는데, 예를 들어 Youtube 프리미엄의 백그라운드 재생 기능을 쓴다던지, 전화 연결을 해놓고 잠시 검색 엔진을 쓴다던지, 음원 스트리밍을 할 때에 서비스를 사용한다. 즉, 사용자의 인터페이스를 방해하지 않고 눈에 보이지 않는 곳에서 작업을 처리한다. 보이지 않는 곳에서 동작한다고 해서 별도의 스레드를 쓰는 것이 아닌 메인 스레드에서 동작한다는 특징이 있다.
- 액티비티와 반대로 직접적인 상호작용을 하지 않는다.
- 액티비티와 동일한 애플리케이션 스레드 UI스레드에서 동작한다.
- Background에서 어떠한 작업을 처리하기 위해 사용된다.
- Application이 종료되어도 Background에서는 계속해서 동작하는 컴포넌트이다.
- Network와 연동이 가능하다.
- 별도의 UI를 가지지 않으며 백그라운드에서 수행된다.
- 다른 프로세스에 API를 제공한다. 즉, 프로세스 사이에 종속성이 있는지 확인한다.
3) 방송 수진자(BroadCast Receiver)
안드로이드 운영체제로부터 발생하는 각종 이벤트와 정보를 받아와 핸들링하는 컴포넌트이다. 디바이스의 시스템 부팅 시의 앱 초기화, 네트워크 끊김 등등 특수한 이벤트에 대한 처리와 저전력 모드 알림, 문자 수신 등의 정보를 받아 처리할 때 동작한다.
- 대다수의 브로드캐스트는 시스템에서 발생한다.
- 사용자 인터페이스를 사용하지 않지만 사태 표시줄 알림을 생성한다.
- 안드로이드 디바이스의 특수한 상황에 대응하기 위해 사용된다.
- 부팅이 완료됨, 화면이 켜짐, 화면이 꺼짐, 전화가 옴, 문자가 옴, 전화를 검 등
4. 콘텐츠 제공자(content Provider)
데이터를 관리하고 다른 애플리케이션의 데이터를 제공하는 데 사용되는 컴포넌트이다. 특정한 Application이 사용하고 있는 데이터베이스를 공유하기 위해 사용하며 애플리케이션 간의 데이터 공유를 위한 표준화된 인터페이스를 제공한다. 예를 들어, 사용자의 연락처 정보를 관리하는 콘텐츠 제공자가 있다고 치면 ContactsContract.Data를 쿼리하여 특정 인물에 대한 정보를 읽고 쓸 수 있다.
- 시스템의 경우 Content Provider는 URI 구성표로 식별된다.
- URI를 소유한 앱은 종류된 후에도 URI를 유지할 수 있다.
- 앱 전용 컴포넌트이기 때문에 공유되지 않는 데이터를 읽고 쓰는 데에도 유용하다.
- SQLite DB, Web, 파일 입출력 등을 통해서 데이터를 관리한다.
- 외부 애플리케이션이 현재 실행 중인 애플리케이션 내에 있는 데이터베이스에 함부로 접근하지 못하게 할 수 있다.
- 음악, 사진 등 큰 크기의 데이터를 공유하는데 적합하다.
- 데이터베이스의 CURD(Creat, Read Update, Delete) 원칙을 준수하며 Read, Write에 대한 퍼미션이 있어야 앱에 접근 가능하다.
참고 자료
'Android > 필기' 카테고리의 다른 글
Android OS 부팅 순서와 자료 구조 (0) | 2023.03.16 |
---|---|
NDK(Native Development Kit) 개요 및 사용법 (0) | 2023.03.11 |
JNI(Java Native Interface) 개요 및 사용법 (0) | 2023.03.11 |
안드로이드 - JAVA, Kotlin (0) | 2023.03.11 |
디컴파일의 개요, 원리 및 이유 (+Apktool) (0) | 2023.03.11 |