안드로이드 Service 컴포넌트 (1편-BackgroundService)

진정한 개발자·2024년 8월 5일

Android Component

목록 보기
1/2
post-thumbnail

안드로이드 개발에서 서비스는 사용자 친화적이고 반응성 있는 애플리케이션을 만드는 데 중요한 역할을 합니다.
서비스는 세 가지 유형이 있습니다.

  1. Background Service
  2. Foreground Service
  3. Bound Service

오늘은 그 중에서 Background Service에 대해 자세히 알아보겠습니다. 🚀

Background Service 🤔

정의

Background Service는 사용자가 직접 인식하지 못하는 작업을 수행하는 서비스입니다. (작동 하고 있는지 모름)
일반적으로 사용자와의 상호작용 없이도 계속 실행되어야 하는 장시간 작업을 의미합니다.

예시

  • 서버와 데이터 동기화 🌐
  • 네트워크 트랜잭션 처리 📡
  • 계산 또는 데이터 처리 작업 🔢

Background Service 구현하기 🛠️

1. 매니페스트에 서비스 정의하기 📝

먼저, AndroidManifest.xml 파일에 서비스를 선언합니다:

<service
    android:name=".MyBackgroundService"
    android:enabled="true"
    android:exported="false" />

2. 서비스 클래스 생성하기 👨‍💻

Service를 확장하는 새로운 Java 또는 Kotlin 클래스를 생성합니다. onStartCommand 메서드를 재정의하여 서비스가 수행할 작업을 정의합니다:

import android.app.Service
import android.content.Intent
import android.os.IBinder
import android.util.Log

class MyBackgroundService : Service() {

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d("MyBackgroundService", "Service started")
        // 서비스가 수행할 작업을 여기에 작성
        
        return START_STICKY
        /**
         * START_STICKY : 서비스가 강제로 종료되었을 때 시스템이 자동으로 다시 시작
         * START_NOT_STICKY : 서비스가 강제로 종료되었을 때 시스템이 다시 시작하지 않음
         * START_REDELIVER_INTENT : 서비스가 강제로 종료되었을 때 시스템이 다시 시작하고 마지막 Intent를 다시 전달
         */
    }

    override fun onBind(intent: Intent?): IBinder? {
        return null
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("MyBackgroundService", "Service destroyed")
    }
}

3. 서비스 시작 및 중지 🚀

서비스를 시작하려면 startService 메서드를 사용하고, 중지하려면 stopService 메서드를 사용합니다:

// 서비스 시작
val intent = Intent(this, MyBackgroundService::class.java)
startService(intent)

// 서비스 중지
stopService(intent)

Background Service의 과제와 해결책 🎯

문제점

Background Service는 강력한 도구이지만, 배터리 소모와 시스템 자원 사용에 주의해야 합니다.
Android 8.0(Oreo) 이후로는 백그라운드에서 장시간 실행되는 서비스를 제한하는 제약이 생겼습니다. ⚡

해결책

WorkManager 사용 🤹‍♂️

WorkManager는 장시간 실행 작업을 보다 쉽게 관리할 수 있는 고수준 API입니다.
다음 포스팅에서는 WorkManager에 대해 더 자세히 다루겠습니다.

import androidx.work.OneTimeWorkRequest
import androidx.work.WorkManager

val myWorkRequest = OneTimeWorkRequest.Builder(MyWorker::class.java).build()
WorkManager.getInstance(this).enqueue(myWorkRequest)

결론 🎉

Background Service는 앱의 성능과 사용자 경험을 향상시키는 중요한 요소입니다.
적절한 관리와 최신 안드로이드 버전의 제약을 고려한 솔루션 선택이 필요합니다.
이 가이드가 Background Service를 이해하고 구현하는 데 도움이 되었기를 바랍니다. 즐거운 코딩 되세요! 🚀

profile
개발자 진정한 입니다

0개의 댓글