본문 바로가기

개발일지/Android

[Android] 4대 컴포넌트와 Intent

4대 컴포넌트

 

안드로이드 앱은 4대 컴포넌트로 이루어져 있다

각 컴포넌트 별 공통적인 특징은

 

1. 각 컴포넌트들은 하나의 독립적인 형태로 존재한다.

2. 각 컴포넌트들은 고유의 기능을 수행한다.

3. 각 컴포넌트들은 인텐트를 통해 서로 상호작용한다.

 

 

 

1. Activity (액티비티)

: 사용자가 애플리케이션과 상호작용하는 단일화면

모든 안드로이드 애플리케이션은 액티비티로 구성되어 있다

 

사용자와의 상호작용을 담당하는 인터페이스

 

안드로이드 애플리케이션은 반드시 하나 이상의 액티비티를 포함하고 있고,

액티비티는 생명주기(Life Cycle) 관련 메서드들을 재정의 하여 원하는 기능을 구현할 수 있다

 

- Intent를 통해 다른 애플리케이션의 액티비티 호출 가능

- 2개 이상의 액티비티를 동시에 표기할 수 없다

- 1개 이상의 View, 또는 View Group을 포함한다

- 액티비티 내에 Fragment를 추가하여 화면을 분할시킬 수 있다

 

ex ) 로그인 화면, 회원가입 화면

 

 

2. Service (서비스)

: 백그라운드(Background)에서 어떠한 작업을 처리하기 위해 서비스를 사용한다

사용자와 직접적으로 상호작용하는 요소는 아님

 

ex) 안드로이드 모바일에서는 애플리케이션을 사용하면서 음원 스트리밍 앱을 사용하거나 다른 작업을 하면서 파일을 다운로드하는 경우

 

서비스는 사용자의 인터페이스(UI, 화면)를 방해하지 않고, 눈에 보이지 않는 곳에서 작업을 처리한다

-> 별도의 스레드(Thread)에서 동작한다고 오해하는 경우가 많은데, 서비스는 엄연히 메인스레드에서 동작한다.

따라서, 서비스 내에서 별도의 스레드를 생성하여 작업을 처리해야 한다

 

일반적으로 오랫동안 실행되고, 다른 앱 구성요소가 사용할 수 있는 기능을 제공한다

- 네트워크와 연동 가능

- 별도의 UI를 가지지 않으며 백그라운드에서 수행된다

- 액티비티와 서비스는 UI스레드라고 불리는 동일한 애플리케이션 스레드로 실행된다

- 애플리케이션이 종료되어도 이미 시작된 서비스는 백그라운드에서 계속 동작한다

 

 

3. Broadcast Receiver (브로드캐스트 리시버, 방송 수신자)

: 안드로이드 OS로부터 발생하는 각종 이벤트와 정보를 받아와 핸들링하는 컴포넌트

사용자 안드로이드 디바이스의 시스템 부팅 시 앱 초기화, 네트워크 끊김 등 특수한 이벤트에 대한 처리나

배터리 부족 알림, 문자 수신과 같은 정보를 받아 처리해야 할 필요가 있을 때 동작한다

 

즉, 안드로이드 OS에서 메신저 앱 또는 문자 메시지가 오면 모든 앱에 "메시지가 왔다"는 하나의 정보를 방송(BroadCast)한다.

이 메시지를 받기 위해 브로드캐스트 리시버를 구현하면 되고, 해당 정보가 오면 특정 이벤트를 처리할 수 있다

- 거의 대부분 UI를 가지지 않는다

- 안드로이드 디바이스의 특수한 상황에 대응하기 위해 사용된다

- 브로드캐스트는 특정한 상황을 제외하곤 시스템에서 시작한다

 

 

4. Content Provider (콘텐츠 프로바이더)

: 콘텐츠 프로바이더(콘텐츠 제공자)는 데이터를 관리하고, 다른 애플리케이션의 데이터를 제공하는 데 사용되는 컴포넌트이다

 

특정한 애플리케이션이 사용하고 있는 데이터베이스를 공유하기 위해 사용한다

 

애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공한다

- SQLite Database / Web / 파일 입출력 등을 통해 데이터를 관리한다

- 외부 앱이 현재 실행 중인 앱 내에 있는 DB에 함부로 접근하기 못하게 할 수 있고, 나 자신이 공개 & 공유하고 싶은 데이터만 공유할 수 있도록 돕는다

- 작은 데이터는 Intent로 앱과 앱 사이의 공유를 할 수 있지만 콘텐츠 프로바이더는 음악 or 사진 파일과 같이 용량이 큰 데이터를 공유하는 데 적합하다

- 프로바이더는 데이터의 읽기, 쓰기에 대한 퍼미션이 있어야 앱에 접근이 가능하다

- 데이터베이스에서 흔히 사용되는 CRUD(Create, Read, Update, Delete)원칙을 준수한다

 

 

 

 

Intent (인텐트)

안드로이드에서 컴포넌트 간의 상호작용은 Intent를 통해 이루어진다

Intent는 다른 앱의 구성요소로부터 작업을 요청하거나, 다른 앱 구성요소로부터 요청을 받을 수 있다

 

ex ) 액티비티에서 다른 액티비티 호출, 서비스에서 브로드캐스트 보내기

 

 

Intent 사용방법

val intent = Intent(현재 액티비티의 Context, 호출 할 Activity)
startActivity(intent)

 

ex)

val intent = Intent(this, SecondActivity::class.java)
startActivity(intent)

 

 

Intent를 통해 데이터 전달하기

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", value)
startActivity(intent)

 

호출된 액티비티에서 전달된 데이터 받기

val getIntentValue = intent.getStringExtra("key")

 

 

명시적 인텐트와 암시적 인텐트

명시적 인텐트 

: 앱의 화면을 전환하는 방법 -> 하나의 액티비티에서 다른 액티비티로 화면 전환 시 사용하는 인텐트

val intent = Intent(this, SecoundActivity::class.java)
startActivity(intent)

 

현재 액티비티에서 다른 액티비티를 호출할 때 사용하며, 인텐트는 액티비티 호출 시 데이터를 전달 or 반환 받을 수 있다

 

 

암시적 인텐트

: 인텐트의 Action에 따라 해당하는 적합한 애플리케이션의 클래스를 호출한다

- 단 하나가 아닌 여러 개가 호출될 수 있다

- 암시적 인텐트는 웹 브라우저 호출, 이메일 전송, 전화 앱으로 통화 등이 해당된다

 

 

웹 브라우저 인텐트 호출

val intent = Intent(Intent.ACTION_VIEW, Uri.parse("www.naver.com"))
startActivity(intent)

 

이메일을 전달하는 인텐트 호출

val intent = Intent(Intent.ACTION_SEND)
intent.type = "text/plain"
intent.putExtra(Intent.EXTRA_EMAIL, "example.example.com")
intent.putExtra(Intent.EXTRA_SUBJECT, "전달할 이메일 제목")
intent.putExtra(Intent.EXTRA_TEXT, "전달할 내용")
startActivity(Intent.createChooser(intent, "Choose Email"))

 

전화걸기 인텐트 호출

val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:010-0000-0000"))
startActivity(intent)

 

인텐트를 사용할 때 주의사항

- 호출 할 액티비티나 서비스가 존재하는 지 확인

- 전달할 데이터의 타입이나 이름을 정확하게 지정

- 필요한 권한 설정

- 호출 할 컴포넌트의 상태를 고려해야 한다