Android에는 앱을 구성하는데 필요한 4개의 구성 요소(Component)가 존재하는데 이를 4대 Component라고 부릅니다.
4대 Component는 Activity(액티비티), Service(서비스), BroadCast Receiver(방송 수신자), Content Provider(콘텐츠 제공자)로 구성되며 각 Component는 독립적인 형태로 존재하고 고유한 기능을 수행하며 Intent(인텐트)를 통해 상호작용 합니다.
Activity (액티비티)
Activity는 사용자에게 보여주는 UI 화면을 구성하는 Component로써 앱의 화면을 나타낸다고 볼 수 있습니다.
Application에서 Activity가 하나도 존재하지 않을 경우 사용자와 상호작용을 할 수 없기 때문에 적어도 하나 이상의 Activity는 반드시 필요합니다.
Service (서비스)
서비스는 백그라운드에서 실행되는 Component로써 Activity와는 달리 실제 사용자와 직접적으로 상호작용 하지는 않습니다.
또한, 다른 Component에서 Service를 실행할 수 있으며 다른 앱으로 전환하더라도 실행이 중지되지 않고 계속 실행됩니다.
Service 유형은 Foreground, Background, Bound로 총 3가지가 존재합니다.
Foreground (포그라운드)
Foreground는 사용자에게 보여지는 작업을 수행하며, 반드시 알림을 표시해야 합니다. 또한, Foreground는 웬만하면 메모리 관리를 위하여 Android System에 의해 강제로 종료되지 않습니다.
예 : 뮤직 앱 (알림에 현재 재생 중인 곡, 이전 곡, 다음 곡 등의 기능을 함께 보여주는 행위들이 가능함)
Background (백그라운드)
Background는 사용자에게 직접적으로 보여지지 않는 작업을 수행합니다. 다만, 메모리 관리를 위하여 Android System에 의해 강제로 종료될 수 있습니다.
예 : 티스토리에서 글 작성 완료 버튼 클릭 후 다른 앱을 실행할 경우 백그라운드에서 글 작성 처리가 이뤄지도록 하는 행위가 가능함
Foreground의 의의는 더 이상 사용자 몰래 어떤 특정 행위를 오랜 시간동안 하는 것을 불가능하도록 만든 기능으로써 부득이하게 오랜 시간동안 사용자의 백그라운드에서 동작해야 한다면 알림을 통하여 이를 고지하도록 강제했다고 볼 수 있습니다.
Bound (바인딩된 서비스)
Android의 Component에서 Service에 Binding 하여 상호 작용할 수 있습니다. 또한, 바인딩된 서비스는 Client-Server Interface를 제공하여 Client와 Server 관계처럼 서비스와 상호작용할 수도 있습니다. 이와 같은 작업 형태로 인해 여러 프로세스 간 통신(IPC, Interprocess Commnuication)을 수행할 수도 있지만, 바인딩이 해제되면 연결된 모든 서비스가 소멸된다는 특징을 가지고 있습니다.
Service의 생명 주기
Broadcast Receiver (방송 수신자)
Broadcast Receiver는 배터리 부족, 문자 수신과 같은 Android 단말기에서 발생하는 이벤트 정보를 수신받아 처리하는 Component 입니다.
Broadcase Message 자체는 작업 문자열이 발생된 이벤트를 수신하는 Intent 객체에서 래핑됩니다.
(ex : android.intent.action.AIRPLANE_MODE)
Broadcast를 수신하는 방법은 manifest에 선언된 수신자를 이용하는 방법과 Context에 등록된 수신자를 이용하는 방법 2가지가 있습니다.
manifest에 선언된 수신자
manifest에 broadcast receiver가 선언된 경우, Broadcast가 전송될 때 앱이 아직 실행 중이 아니라면 시스템에서 앱을 실행할 수 있습니다.
앱이 설치될 때 System의 Package 관리자가 수신자를 등록하게 되는데, 이를 통해 앱이 실행되고 있지 않을 경우 시스템에서 앱을 시작하고 Broadcast를 전달할 수 있게 됩니다. (수신자가 앱의 진입점이 될 수 있다는 뜻)
※ 앱이 API 26 이상을 타겟팅하고 있을 경우 일부 예외 사항을 제외하고는 manifest를 사용하여 Implicit broadcast의 수신자를 선언할 수 없습니다.
Context에 등록된 수신자
Context에 등록된 수신자의 경우 등록을 한 Context가 유효한 동안에만 Broadcast를 수신할 수 있습니다.
즉, Activity Context에 수신자를 등록한 경우 Activity가 제거되기 전까지만 Broadcast를 수신할 수 있으며, Application Context에 등록한 경우 앱이 실행되는 동안에만 Broadcast를 수신할 수 있게 됩니다.
Content Provider (콘텐츠 제공자)
Content Provider는 서로 다른 Application에 저장된 Data를 공유하는 Component로써 애플리케이션끼리 Data를 공유할 수 있는 유일한 방법입니다.
Content Provider를 통하여 데이터에 접근할 때는 앱의 Context에서 ContentResolver 객체를 사용하여 데이터 제공자에 접근하게 됩니다. Content Resolver는 데이터 제공자와 통신하여 Content Provider를 구현하는 클래스의 Instance를 가져와 해당 Provider 객체를 통하여 데이터를 요청하여 결과를 수신하는 역할을 담당합니다.
Content Provider를 구현한 Application에서는 Data를 조회(SELECT), 삽입(INSERT), 수정(UPDATE), 삭제(DELETE)할 수 있습니다.
Content Provider를 구현한 Application이 꼭 실행 중이 아니더라도 다른 Application에서 Content Provider에 접근할 수 있으며, Content Provider를 통하여 데이터에 접근하기 위해서는 해당 Content Provider의 URI를 구성하는 Authority(Content Provider 고유 주소), Path(접근하는 데이터를 나타내는 값) , id(식별 값, 생략 가능)를 정확하게 알고 있어야 합니다.
URI 구성 : content://authority/path
단일 행에 대한 URI 구성 : content://authority/path/<id>
또한, 특정 Application의 Content Provider에 접근하기 위해서는 AndroidManifest.xml 파일에 해당 Content Provider에 대한 권한을 허용해야 합니다.
<uses-permission android:name="com.hacksms.contentprovider.provider.READ_WRITE"/>
Intent (인텐트)
Intnet는 Component가 무엇을 할 것인가를 담은 메시지 객체이며, 다른 Component를 오가며 화면을 전환하거나 Data를 주고 받으며 통신할 수 있도록 도와주는 전달 수단으로써의 역할을 합니다.
이러한 Intent를 이용하는 통신 방법은 2가지(명시적, 암시적)가 존재합니다.
Explicit Intent (명시적 인텐트)
명시적 인텐트는 Class 객체나 Component 이름 등을 통하여 호출할 대상을 확실히 지정할 수 있는 경우에 사용되며, 보통 Application 내부의 Component에 주로 사용됩니다.
예 : A Activity에서 B Activity를 호출하거나 C Service에 데이터를 전달할 때와 같이 호출하고자 하는 대상이 명확한 경우에 사용
// Executed in an Activity, so 'this' is the Context
// The fileUrl is a string URL, such as "http://www.example.com/image.png"
val downloadIntent = Intent(this, DownloadService::class.java).apply {
data = Uri.parse(fileUrl)
}
startService(downloadIntent)
Implicit Intent (암시적 인텐트)
암시적 인텐트는 대상을 지정하지 않고 특정 기능(ex: 문서 열기, 브라우저 접속)에 적합한 Component를 찾아 실행하는 경우에 사용합니다.
예 : 지도 기능이 필요할 때 현재 Android 단말기에서 설치된 지도 관련 앱(네이버 지도, 카카오 지도, 구글 지도)을 사용자가 선택하여 실행하는 것과 같이 호출하고자 하는 대상은 불명확하지만 실행하고자 하는 기능은 명확한 경우에 사용
// Create the text message with a string
val sendIntent = Intent().apply {
action = Intent.ACTION_SEND
putExtra(Intent.EXTRA_TEXT, textMessage)
type = "text/plain"
}
// Verify that the intent will resolve to an activity
if (sendIntent.resolveActivity(packageManager) != null) {
startActivity(sendIntent)
}
'Study > Mobile' 카테고리의 다른 글
[Kotlin] 딥링크 (DeepLink) (0) | 2022.08.07 |
---|---|
[Kotlin] WebView 사용 방법 (0) | 2022.08.07 |
iOS Application Life Cycle (0) | 2022.03.18 |
[Kotlin] ROOM Database 사용 방법 (0) | 2022.01.10 |
[Kotlin] Intellij에서 Anroid 세팅 (0) | 2022.01.04 |
댓글