안드로이드 4대 컴포넌트

eun3673·2020년 4월 11일
1

Android

목록 보기
1/2
post-thumbnail

안녕하세요, 오늘은 아래 사진과 함께, 안드로이드 4대 컴포넌트에 관한 로깅을 시작하겠습니다.

먼저, 위 사진에서 알수있듯이, 각 컴포넌트들은,
1. 하나의 독립적인 형태로 존재하며,
2. 인텐트를 통해서 서로 상호작용합니다.
3. 각 컴포넌트들은 각자 고유의 기능을 수행 한다는 공통적인 특징이 있습니다..

그럼, 각 컴포넌트에 대해 알아보겠습니다.

1. Activity

Activity를 한마디로 정의하면

사용자에게 제공되는 UI가 있는 화면

이라고 할 수 있겠네요. 사람들마다 표현 방식이 조금씩 다르긴 하지만, 사용자와 상호작용 한다는 원론적인 개념은 같습니다.

다음으로 Activity의 주요(주관적인..) 특징은 아래와 같습니다.

  1. 모든 Activity의 클래스가AndroidManifest.xml에 해당하는 <activity> 선언을 가지고 있어야 합니다.
  2. Activity내에 Fragment를 선언하여 화면 분할이 가능합니다.
  3. Application 빌드가 성공적으로 이루어지려면 반드시 하나 이상의 Activity가 선언되어야 합니다.
  4. 모든 Activity와 Service는 UI Thread라는 동일한 Application Thread로 실행됩니다.
  5. 실행된 Acticity(Activity Instance)는 Stack에 push되며, onBackPressed된다면, Pop됨. 또한, Activity의 생명주기에 따라서 App또는, 특정 Activity가 종료될 수 있습니다.

더 많은 특징이 있으나, 3가지 정도로만 축약하겠습니다.
자세한 내용은 Android Developers 공식문서 | Activity 를 참고하시기 바랍니다.

Q&A

Q : Fragment 컴포넌트를 만들고 5대 컴포넌트라고 해야하지 않나요?? 아니면 Fragment 가 Activity를 상속하는 구조인가요??

A : 둘다 아닙니다. Fragment는 Activity의 특징 일부를 물려받은 독자적인 생명주기를 가지는 UI컴포넌트입니다.
쉽게말해, Button 과 EditText와 같은 선상에 있는 개념입니다.

2. Service

Service는 Activity와는 다른 개념입니다. 사용자와 상호작용하지도, UI도 없습니다.
Service는 아래와 같이 정의할 수 있습니다.

백그라운드 or 포그라운드 or 바인드에서 실행되는 프로세스

보통은 백그라운드에서 작동되는 서비스라고 흔히들 말씀하십니다.
하지만, API 26이상의 앱부터는 백그라운드 서비스 실행에 대한 제한이 적용되기에, 포그라운드와 백그라운드의 개념을 명확히 할 필요가 있다고 생각하여 구분하여 설명하겠습니다.


포그라운드 서비스

포그라운드 서비스는 백그라운드 서비스와 달리, 서비스가 실행중임을 알림으로 표시해야 합니다.

멜론같은 오디오 앱이 포그라운드 서비스의 예시가 될 수 있겠네요.
오디오 앱은, 오디오 트랙을 재생할 때 포그라운드 서비스를 사용합니다. 그리고, 알림으로 오디오 트랙이 재생중임을 알려줍니다.
이와같이 포그라운드 서비스를 사용하는 오디오 앱들은, 사용자가 앱과 상호작용하지 않을 때도 계속 실행된다는 포그라운드 서비스의 특징을 잘 나타내주고 있습니다.

포그라운드 서비스의 주요(또한 주관적인..) 특징은 아래와 같습니다.

  1. 서비스의 동작을 사용자가 명시적으로 인지할수 있도록 합니다.
  2. 메모리 부족시 시스템에 의한 종료대상에서 재외됩니다.
  3. 사용자가 앱과 상호작용하지 않을때도 계속 실행됩니다.

백그라운드 서비스

백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행합니다.

백그라운드 서비스는 앞에서 이야기했듯, API 26이상의 앱부터는 백그라운드 서비스 실행에 대한 제한이 적용되어 안정적인 사용에는 무리가 있을듯 합니다.

백그라운드 서비스는 포그라운드 서비스와 달리, 시스템이 리소스가 부족한 경우 임의로 중단할 수 있다는 큰 단점을 가지고 있습니다.

많은 경우 앱이 백그라운드 서비스를 JobScheduler 작업으로 대체할 수 있습니다.

라는 내용이 공식 문서에 명시되어 있습니다만.. 조금 더 공부가 필요한 내용인듯 합니다. 아직 감이 전혀 오질않네요..

관련 내용에 대해 추가적으로 궁금한 내용은 Android Developers 공식문서 | 백그라운드 실행 제한 을 참고하시기 바랍니다.(관련된 내용을 아시는분은 댓글로 알려주세요ㅠㅠ)

바인드 서비스

애플리케이션 구성 요소가 startService()대신, bindService()를 호출하여 시작되는 서비스

바인딩된 서비스는 마치 클라이언트<->서버와 같이 동작하며, 서비스가 서버 역할을 합니다.
또한, 액티비티는 서비스에 어떠한 요청을 할수 있고, 서비스로부터 어떠한 결과를 받을수 있습니다.

따라서,

  1. 여러 액티비티에서 하나의 서비스에 지속적으로 접근해야할 작업이 있을경우
  2. 애플리케이션 안의 기능을 외부에 제공하는 경우[1]

바인드 서비스를 사용하면 됩니다.

아, 가장 중요한 사실중 하나는, 서비스에 연결된 클라이언트가 모두 unbindService()된 상태면, 서비스는 소멸되어 버리기에, 무한하게 존재할 수 없습니다.


이렇게, 서비스에 대해 이야기 해보았습니다.
자세한 내용은 Android Developers 공식문서 | 서비스 를 참고하시기 바랍니다.

3.Content Provider

애플리케이션이 자체적으로 저장된 데이터, 다른 앱이 저장한 데이터에 대한 액세스 권한을 관리하도록 돕고 다른 앱과 데이터를 공유할 방법을 제공하는 컴포넌트 입니다.

쉽게말해, 애플리캐이션간 데이터를 공유할 수 있도록 도와주는 컴포넌트라고 생각하시면 됩니다.

여기에서 데이터 공유란, 데이터 작성, 삭제, 갱신, 조회 등의 작업을 포함합니다.
데이터는, DB뿐만아니라, 인증키 형식의 데이터도 포함됩니다.

자세한 사용방법은 choiDev | ContentProvider_DB / 아라비안나이트 | ContentProvider_인증키 게시물을 참고해주세요.

보다 자세한 개념설명은, Android Developers 공식문서 | 컨텐츠 제공자를 참고하시기 바랍니다.

마지막으로, 위에서 말했던, 인증키 같은 간단한 데이터들은 Intent로 데이터를 공유하는 방식이 효율적이지 않을까? 라는 개인적인 생각을 가져봅니다.

4. BrodCast Receiver

보통, 안드로이드 내부적으로(OS에서) 발생하는 각종 이벤트와 Data를 받아와 핸들링하는 컴포넌트입니다.

내부적으로 발생하는 이벤트라 함은, 배터리부족, 충전중인지 여부, 문자메세지 수신, 전화수신 등의 이벤트를 말합니다.

하지만, 내부적으로 발생하는 이벤트만 수신할 수 있는것은 아닙니다.

val intent = Intent()
intent.action = "lime.recive.message"
sendBroadcast(intent)

위 코드처럼, 다른 애플리케이션에서 임의로 이벤트를 발생시킨 이벤트도 수신이 가능합니다.
BrodCast Receiver의 특징을 정리해보자면,

  1. 통상적으로, 안드로이드 내부적으로 발생하는 이벤트를 수신할 수 있다.
  2. 임의로 이벤트를 발생시킬 수 있다.
  3. 다른 애플리케이션에서 임의로 발생시킨 이벤트도 수신이 가능하다.

더 많은 특징과 사용법이 있지만 이만 줄이겠습니다.

브로드캐스트 관련 내용은, 서준수 | BrodCast Receiver 를 참고하여 작성되었습니다.
본 BrodCast Receiver 설명에는 생략된 내용이 많습니다. 자세한 정보가 필요하다면 꼭 방문 해 보시는것을 추천드립니다.

5. Intent

앞 내용에 인텐트라는 말이 계속 등장했었는데요
인텐트란

4대 컴포넌트간 통신을 하기위한 메시징 객체입니다.

Intent는 보통,

  1. 엑티비티 시작 ( Ex. startActivity(Intent) )
  2. 서비스의 시작 ( Ex. startService(Intent))
  3. 브로드캐스트 전달 ( Ex. sendBrodcast(Intent))

대부분 위와같은 일반적인 case에서 많이 사용됩니다.

자세한 내용은Android Developers 공식문서 | Intent, Intent Filters 를 참고하시기 바랍니다.


이렇게 4대컴포넌트에 대해 로깅을 해봤는데요, 저도 잘 몰랐던 내용들 알게된 좋은 기회였던것 같습니다.

혹시, 내용에서 잘못된 내용이나 부족한 내용에 대해서는 댓글로 남겨주시면 보완해 나가도록 하겠습니다.

다음에는 각 컴포넌트별(Activity/Service) 생명주기에 대해 알아보겠습니다.


[1] AndroidManifest.xml에 android:exported를 false로 설정하면 다른 애플리캐이션으로부터의 액세스를 차단 할 수 있습니다.

profile
대구소프트웨어고등학교에 재학중이며 교내 B1ND팀에서 안드로이드 개발/ 4기팀장을 맡고있습니다.

0개의 댓글