Foreground Service ๊ฐ„๋‹จ์ •๋ฆฌ ๐Ÿš€

์ด์ง„์˜ยท2025๋…„ 9์›” 12์ผ
post-thumbnail

๐Ÿ‘‹ ๋“ค์–ด๊ฐ€๋ฉฐ

์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด,
๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ๋„ ๋Š๊ธฐ์ง€ ์•Š๊ณ  ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š” ์ž‘์—…์ด ์žˆ์–ด์š”.

์˜ˆ๋ฅผ ๋“ค์–ด:

  • ๐ŸŽต ์Œ์•… ์žฌ์ƒ
  • ๐Ÿ“ ์œ„์น˜ ์ถ”์ (GPS ๋„ค๋น„๊ฒŒ์ด์…˜)
  • ๐Ÿ“ก ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™”

์ด๋Ÿด ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ ํฌ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค(Foreground Service)์ž…๋‹ˆ๋‹ค.
์˜ค๋Š˜์€ Foreground Service์˜ ๊ฐœ๋…, ํŠน์ง•, ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€


๐ŸŒŸ Foreground Service๋ž€?

Foreground Service๋Š”
์•ฑ์ด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ์–ด๋„ ์ค‘์š”ํ•œ ์ž‘์—…์„ ์ค‘๋‹จ ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์˜ˆ์š”.

  • ์ผ๋ฐ˜ Service์™€ ๋‹ฌ๋ฆฌ,
    ์‚ฌ์šฉ์ž์—๊ฒŒ Notification์„ ๋ฐ˜๋“œ์‹œ ํ‘œ์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • Android 8.0(Oreo, API 26)๋ถ€ํ„ฐ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ œํ•œ์ด ๊ฐ•ํ™”๋˜๋ฉด์„œ
    Foreground Service ์‚ฌ์šฉ์ด ์ ์  ๋” ์ค‘์š”ํ•ด์กŒ์–ด์š”.

๐Ÿ‘‰ ํ•ต์‹ฌ:
์ค‘์š”ํ•œ ์ž‘์—…์ด ์‹คํ–‰ ์ค‘์ž„์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๊ณ , ์‹œ์Šคํ…œ์— ์˜ํ•ด ์‰ฝ๊ฒŒ ์ข…๋ฃŒ๋˜์ง€ ์•Š๋„๋ก ๋ณด์žฅ


๐ŸŽฏ Foreground Service ์ฃผ์š” ํŠน์ง•

  1. ๐Ÿ“Œ Notification ํ•„์ˆ˜
    • ์‹คํ–‰ ์ค‘์ž„์„ ์•Œ๋ฆฌ๋Š” ์•Œ๋ฆผ์„ ํ•ญ์ƒ ํ‘œ์‹œํ•ด์•ผ ํ•จ
  2. ๐Ÿ”‹ ๋ฐฐํ„ฐ๋ฆฌ ์ œ์•ฝ ์™„ํ™”
    • ์ผ๋ฐ˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์„œ๋น„์Šค๋ณด๋‹ค ์ข…๋ฃŒ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋‚ฎ์Œ
  3. โšก ์‹ค์‹œ๊ฐ„ ์ž‘์—… ์ ํ•ฉ
    • ์Œ์•…, ๋„ค๋น„๊ฒŒ์ด์…˜, ํ”ผํŠธ๋‹ˆ์Šค ํŠธ๋ž˜ํ‚น ๋“ฑ์— ์ ํ•ฉ

๐Ÿ› ๏ธ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•

1. ์„œ๋น„์Šค ํด๋ž˜์Šค ์ •์˜

@AndroidEntryPoint
class MusicService : Service() {

    private val channelId = "music_channel"

    override fun onCreate() {
        super.onCreate()
        createNotificationChannel()
    }

    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        val notification = NotificationCompat.Builder(this, channelId)
            .setContentTitle("๐ŸŽต ์Œ์•… ์žฌ์ƒ ์ค‘")
            .setContentText("ํ˜„์žฌ ๊ณก: Imagine - John Lennon")
            .setSmallIcon(R.drawable.ic_music_note)
            .build()

        // Foreground Service ์‹œ์ž‘
        startForeground(1, notification)

        // ์‹ค์ œ ์‹คํ–‰ํ•  ์ž‘์—… (์˜ˆ: ์Œ์•… ์žฌ์ƒ ๋กœ์ง)
        return START_STICKY
    }

    override fun onBind(intent: Intent?): IBinder? = null

    private fun createNotificationChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val channel = NotificationChannel(
                channelId,
                "Music Playback",
                NotificationManager.IMPORTANCE_LOW
            )
            getSystemService(NotificationManager::class.java).createNotificationChannel(channel)
        }
    }
}

2. ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋“ฑ๋ก

<service
    android:name=".MusicService"
    android:exported="false"
    android:foregroundServiceType="mediaPlayback" />
  • foregroundServiceType โ†’ ์–ด๋–ค ์œ ํ˜•์˜ ์ž‘์—…์ธ์ง€ ๋ช…์‹œ (location, mediaPlayback, dataSync ๋“ฑ)
  • Android 10(API 29) ์ด์ƒ์—์„œ๋Š” ํ•„์ˆ˜ ์†์„ฑ

3. ์„œ๋น„์Šค ์‹คํ–‰

val intent = Intent(context, MusicService::class.java)
ContextCompat.startForegroundService(context, intent)

โœจ ์ฃผ์š” ์ด์ 

  1. ๐Ÿ›‘ ๊ฐ•์ œ ์ข…๋ฃŒ ๋ฐฉ์ง€
    • ์ค‘์š”ํ•œ ์„œ๋น„์Šค๊ฐ€ ์‹œ์Šคํ…œ์— ์˜ํ•ด ์‰ฝ๊ฒŒ ์ฃฝ์ง€ ์•Š์Œ
  2. ๐Ÿ‘€ ์‚ฌ์šฉ์ž ์ธ์ง€ ๊ฐ€๋Šฅ
    • ์•Œ๋ฆผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž์—๊ฒŒ ํ•ญ์ƒ ๋…ธ์ถœ
  3. ๐Ÿงฉ ๋‹ค์–‘ํ•œ ์ž‘์—… ์ง€์›
    • ์Œ์•…, ์œ„์น˜, ํ†ตํ™” ๋…น์Œ, ์„ผ์„œ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๋“ฑ

๐Ÿšฉ ์ฃผ์˜ํ•  ์ 

  • Notification์€ ํ•„์ˆ˜, ์ˆจ๊ธธ ์ˆ˜ ์—†์Œ
  • ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋‚จ์šฉํ•˜๋ฉด โ†’ ๋ฐฐํ„ฐ๋ฆฌ ๋‚ญ๋น„ + ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ์ €ํ•ด
  • Android 12(API 31)๋ถ€ํ„ฐ๋Š” Foreground Service ์‹คํ–‰์— ์ œ์•ฝ์ด ๊ฐ•ํ™”๋จ
    • ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” WorkManager ๊ถŒ์žฅ
  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์„œ๋น„์Šค ์‹œ์ž‘ ์‹œ ๊ถŒํ•œ ํ•„์š” (FOREGROUND_SERVICE_PERMISSION)

โœ… Best Practice

  • โœ… ์ •๋ง ์ค‘์š”ํ•œ ์ž‘์—…(์‚ฌ์šฉ์ž๊ฐ€ ์ธ์‹ํ•ด์•ผ ํ•˜๋Š” ์‹คํ–‰)์—๋งŒ ์‚ฌ์šฉ
  • โœ… foregroundServiceType์„ ๋ช…ํ™•ํžˆ ์ง€์ • (๋ฏธ๋””์–ด/์œ„์น˜/๋ฐ์ดํ„ฐ ๋“ฑ)
  • โœ… Notification์˜ ์ฝ˜ํ…์ธ ๋ฅผ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์ž‘์„ฑ
  • โŒ ๋‹จ์ˆœ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋‚˜ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์—๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋ง๊ณ  โ†’ WorkManager ๊ถŒ์žฅ

๐Ÿงพ ๋งˆ๋ฌด๋ฆฌ

์˜ค๋Š˜์€ Foreground Service์— ๋Œ€ํ•ด ์‚ดํŽด๋ดค์Šต๋‹ˆ๋‹ค.

  • ๐Ÿ“Œ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ œ์•ฝ ์†์—์„œ๋„ ์ค‘์š”ํ•œ ์ž‘์—…์„ ์•ˆ์ „ํ•˜๊ฒŒ ์‹คํ–‰
  • ๐Ÿ“Œ ๋ฐ˜๋“œ์‹œ Notification๊ณผ ํ•จ๊ป˜ ์‹คํ–‰
  • ๐Ÿ“Œ Android 10+์—์„œ๋Š” foregroundServiceType ์ง€์ • ํ•„์š”

๐Ÿ‘‰ ๊ฒฐ๋ก :
Foreground Service๋Š” โ€œ์ค‘์š”ํ•œ ์‹คํ–‰์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์•Œ๋ฆฌ๋ฉฐ ๋ณด์žฅํ•˜๋Š” ์„œ๋น„์Šคโ€์ž…๋‹ˆ๋‹ค. ๐Ÿš€

profile
Android Developer

0๊ฐœ์˜ ๋Œ“๊ธ€