본문 바로가기
개발/Android

[Android] 백그라운드 작업을 위한 Service (1) - 기본 개념

by tempus 2022. 7. 5.
반응형

🔴 개요

백그라운드에서 오래 실행되는 작업을 위한 애플리케이션 컴포넌트 

 

서비스는 크게 3가지 특징이 있습니다.

  1. 일반적으로 서비스는 보이지 않는 화면에서 동작합니다.
  2. 다른 애플리케이션 구성 요소가 서비스를 시작할 수 있으며 이는 사용자가 다른 애플리케이션으로 전환하더라도 백그라운드에서 동작할 수 있습니다.
  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을 반환

 

반응형

댓글


loading