Android

Android - Service

임베디드 친구 2024. 11. 16. 10:57
반응형

안드로이드 애플리케이션 개발에서 Service는 백그라운드에서 작업을 실행하기 위해 사용됩니다. 화면에 UI를 보여주지 않고도 애플리케이션이 오래 실행되어야 하는 경우에 유용합니다. 예를 들어 음악 재생, 위치 추적, 파일 다운로드 등 다양한 백그라운드 작업을 처리할 때 Service를 사용할 수 있습니다.

이번 포스팅에서는 Android Service에 대해 간단히 설명하고, 직접 구현해보는 예제를 통해 실습해보도록 하겠습니다. 예제는 Kotlin을 사용하여 작성되었습니다.

Service란 무엇인가요?

Service는 백그라운드에서 오랜 시간 실행되어야 하는 작업을 처리하기 위한 컴포넌트입니다. Activity와 달리 UI를 제공하지 않으며, 백그라운드에서 동작하게 됩니다. 크게 두 가지 종류의 Service가 있습니다:

  1. Started Service: 컴포넌트가 호출하여 시작되고, 작업이 완료될 때까지 백그라운드에서 실행되는 서비스입니다. 예를 들어 파일을 다운로드하거나 네트워크 요청을 처리하는 작업입니다.

  2. Bound Service: 애플리케이션 컴포넌트가 바인딩되어 상호작용할 수 있는 서비스입니다. 예를 들어, 특정 데이터를 가져오거나 특정 작업을 지속적으로 요청하는 경우 사용됩니다.

Service는 백그라운드 작업을 수행하기 때문에 효율적인 리소스 관리를 위해 사용법을 잘 이해해야 합니다. 이제 Service를 구현하는 방법을 알아보겠습니다.

Service 예제 - 음악 재생 서비스 구현하기

이제 실제로 Service를 구현하여 음악 재생 애플리케이션의 일부 기능을 만들어 보겠습니다. 이 예제에서는 Started Service를 사용하여 음악 파일을 백그라운드에서 재생하는 방법을 다룹니다.

1. AndroidManifest.xml 설정

Service를 사용하려면, AndroidManifest.xml에 서비스에 대한 정보를 추가해야 합니다. 다음과 같이 MusicService를 선언합니다.

<service android:name=".MusicService" />

2. MusicService 클래스 구현

다음으로 Service 클래스를 구현합니다. ServiceonBind() 메서드를 반드시 오버라이드해야 합니다. 이 예제에서는 MediaPlayer를 사용하여 음악을 재생하는 간단한 서비스를 구현해 보겠습니다.

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

class MusicService : Service() {

    private lateinit var mediaPlayer: MediaPlayer

    override fun onCreate() {
        super.onCreate()
        Log.d("MusicService", "Service Created")
        // MediaPlayer 초기화
        mediaPlayer = MediaPlayer.create(this, R.raw.sample_music)
        mediaPlayer.isLooping = true // 반복 재생 설정
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.d("MusicService", "Service Started")
        mediaPlayer.start() // 음악 재생 시작
        return START_STICKY
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("MusicService", "Service Destroyed")
        mediaPlayer.stop() // 음악 재생 중지
        mediaPlayer.release() // MediaPlayer 리소스 해제
    }

    override fun onBind(intent: Intent?): IBinder? {
        // 이 예제에서는 바인딩을 제공하지 않으므로 null을 반환합니다.
        return null
    }
}

3. Service 시작 및 중지

서비스를 시작하거나 중지하려면 Activity에서 Intent를 사용하여 Service를 제어할 수 있습니다. 아래 예제는 MainActivity에서 Service를 시작하고 중지하는 방법을 보여줍니다.

import android.content.Intent
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.widget.Button

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val startButton: Button = findViewById(R.id.startButton)
        val stopButton: Button = findViewById(R.id.stopButton)

        // 서비스 시작 버튼 클릭 시
        startButton.setOnClickListener {
            val intent = Intent(this, MusicService::class.java)
            startService(intent)
        }

        // 서비스 중지 버튼 클릭 시
        stopButton.setOnClickListener {
            val intent = Intent(this, MusicService::class.java)
            stopService(intent)
        }
    }
}

4. UI 레이아웃 (activity_main.xml)

간단한 UI 레이아웃 파일을 작성하여 서비스 시작과 중지를 제어해 보겠습니다.

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <Button
        android:id="@+id/startButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Start Music Service" />

    <Button
        android:id="@+id/stopButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Stop Music Service"
        android:layout_marginTop="16dp" />
</LinearLayout>

Service의 생명주기

Service의 생명주기는 Activity와는 다릅니다. Service는 시작될 때 onCreate() -> onStartCommand() 순서로 호출되며, 중지될 때는 onDestroy()가 호출됩니다.

  • onCreate(): Service가 처음 생성될 때 호출됩니다. 초기화 작업을 수행할 수 있습니다.
  • onStartCommand(): Service가 시작될 때 호출됩니다. 실제 작업이 시작되는 부분입니다.
  • onDestroy(): Service가 중지될 때 호출됩니다. 리소스를 해제하는 작업을 수행합니다.

START_STICKY, START_NOT_STICKY와 같은 반환 값은 Service가 종료된 이후의 동작을 결정합니다. 예를 들어 START_STICKY는 시스템이 서비스가 종료된 후에도 재시작하도록 요청합니다.

예제 설명

위의 예제에서 MusicServiceStarted Service의 형태로 구현되었습니다. MainActivity에서 버튼을 클릭하면 서비스를 시작하거나 중지할 수 있습니다. 음악 재생은 Service에서 MediaPlayer를 사용하여 이루어집니다. 서비스가 중지될 때는 mediaPlayer를 해제하여 리소스를 낭비하지 않도록 합니다.

Service 사용 시 주의사항

  • Service는 백그라운드에서 오랜 시간 실행될 수 있으므로, 배터리 소모에 주의해야 합니다.
  • Android 8.0 (API 레벨 26) 이상에서는 Foreground Service를 사용하여 백그라운드 실행 제약을 피할 수 있습니다. Foreground Service는 사용자에게 실행 중임을 알리는 알림을 제공하여 시스템에 의해 종료되지 않도록 합니다.

결론

Service는 안드로이드 애플리케이션에서 백그라운드 작업을 수행하기 위한 중요한 컴포넌트입니다. 이번 포스팅에서는 Service의 기본 개념과 실제 예제를 통해 Started Service를 구현하는 방법을 살펴보았습니다. 이를 통해 백그라운드에서 오랜 시간 실행되어야 하는 작업을 구현할 수 있게 됩니다.

다음 포스팅에서는 Foreground ServiceBound Service를 다루어 보도록 하겠습니다.

반응형