🔴 개요
백그라운드에서 오래 실행되는 작업을 위한 애플리케이션 컴포넌트
서비스는 크게 3가지 특징이 있습니다.
- 일반적으로 서비스는 보이지 않는 화면에서 동작합니다.
- 다른 애플리케이션 구성 요소가 서비스를 시작할 수 있으며 이는 사용자가 다른 애플리케이션으로 전환하더라도 백그라운드에서 동작할 수 있습니다.
- 구성 요소를 서비스에 바인딩하여 서비스와 상호작용할 수 있다.
우리는 서비스를 통해서 다음과 같은 기능을 백그라운드에서 구현할 수 있습니다.
- 음악 재생
- 프로세스 간 통신(IPC)
- 파일 입출력
- 네트워크 트랜잭션
크게 서비스는 3가지 유형이 있습니다. (포그라운드
, 백그라운드
, 바인드
) 각 유형의 자세한 내용은 다음 포스팅에서 하나하나 알아봅시다.
🔴 서비스 vs 스레드 (Service, IntentService)
서비스는 그저 백그라운드에서 실행될 수 있는 구성 요소일 뿐입니다. 서비스를 사용하는 경우 기본적으로 애플리케이션의 Main Therad에서 계속 실행되므로 서비스가 해야할 작업이 많거나 중간에 Blocking 작업이 들어간다면 서비스 내에 새 스레드를 생성을 해야 합니다.
여기서 우리는 두 가지 클래스를 통해 서비스를 구현할 수 있습니다.
Service
기본적인 서비스 클래스, 서비스는 기본적으로 Main Thread를 사용하기 때문에 성능을 저하시킬 수 있으므로 새 스레드를 생성해주어야 한다.
IntentService
Service
의 하위 클래스, Work Thread를 사용하여 모든 시작 요청을 한번에 하나씩 처리합니다. 만약 서비스가 여러 개의 요청을 동시에 처리하지 않아도 되는 경우 사용합니다.
🔴 서비스 유형
🔺 포그라운드(Foreground)
일반적인 서비스와 다르게 사용자에게 잘 보이는 몇몇 작업을 수행합니다. 쉽게 예를 들 수 있는 것이 우리가 자주 사용하는 음악 앱들입니다. 음악 트랙을 재생할 때 포그라운드 서비스를 사용합니다. 그리고 포그라운드 서비스는 알림을 표시해야 합니다. 사용자가 다른 앱을 사용중이어도 계속해서 실행될 수 있기 때문에 서비스라고 불립니다.
알림을 표시하는 이유는 포그라운드 서비스는 사용자가 인식을 하고 있기 때문에 메모리 부족으로 인한 시스템이 자동으로 중단할 수 없기 때문입니다. 그렇기에 알림을 표시하여 사용자에게 알리고 필요 시 중지시키기 위함입니다. 이는 다른 말로 하면 너무 많은 포그라운드 서비스는 앱의 성능 저하의 원인이 될 수 있습니다.
🔺 백그라운드(Background)
백그라운드 서비스는 사용자에게 직접 보이지 않는 작업을 수행합니다. 우리가 흔히 아는 기본적인 서비스 기능들은 대부분 백그라운드 서비스에 속합니다. (네트워크 트랜잭션, 계산이 오래 걸리는 작업 등)
🔺 바인드(Bound)
애플리케이션 구성 요소(Activity나 Fragment 등) bindService()
를 호출하여 해당 구성 요소에 서비스를 바인딩할 수 있습니다. 바인딩된 서비스는 Client-Server 인터페이스를 제공하여 구성 요소가 서비스와 상호작용할 수 있으며, 결과를 받고 이와 같은 작업을 여러 프로세스에 걸쳐 IPC를 수행할 수도 있습니다.
서비스에 바인딩된 구성 요소는 여러 개일 수 있습니다. 하지만 바인딩된 모든 구성 요소가 해제되면 서비스는 소멸합니다.
🔴 기본 구성
기본적으로 서비스를 사용하기 위해서 AndroidManifest.xml 에 서비스를 등록하여야 합니다. <application>
요소의 하위에 추가하면 됩니다. 기본적으로 tool을 사용하면 자동적으로 추가가 됩니다.
<service
android:name=".MyService"
android:enabled="true"
android:exported="true"></service>
exported를 false로 하면 서비스를 본인의 앱에서만 사용 가능 , 아니면 다른 앱과 상호작용할 수 있습니다.
enabled는 시스템에 의해 서비스가 인스턴스화 될수 있는지를 의미하고 default는 true입니다.
기본적으로 서비스는 Service 클래스를 상속받아서 생성합니다. 구성은 기본적으로 다음과 같이 되어 있습니다.
import android.app.Service
import android.content.Intent
import android.os.IBinder
class BasicService : Service() {
override fun onCreate() {
super.onCreate()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
}
override fun onBind(intent: Intent): IBinder {
TODO("Return the communication channel to the service.")
}
}
- onDestroy() : 서비스를 더 이상 사용하지 않고 소멸할 때 호출
- onCreate() : 서비스가 처음 생성되었을 때 호출
- onStartCommand() : 다른 구성 요소가 서비스를 시작하도록 요청하는 경우 호출
- onBind() : 다른 구성 요소가 해당 서비스에 바인딩되고자 하는 경우에 이 메서드를 호출, 바인딩을 허용하지 않으려면 null을 반환
'개발 > Android' 카테고리의 다른 글
[Android] DataBinding이란? (0) | 2022.08.14 |
---|---|
[Android] The emulator process for AVD has terminated 오류 해결 (0) | 2022.07.09 |
[Android] 리스트 업데이트를 위한 ListAdapter (0) | 2022.06.07 |
[Android] LiveData에 대해 알아보자 (0) | 2022.05.10 |
[Android] ViewModel Factory에 관하여 (1) | 2022.05.04 |
댓글