๐ก์๋๋ก์ด๋ 4๋ ์ปดํฌ๋ํธ ์ค ํ๋์ธ Service์ ๋ํ์ฌ ์ ๋ฆฌํ์์ต๋๋ค.
Service
- Service๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ปดํฌ๋ํธ์ ๋๋ค.
- ์ฌ์ฉ์๊ฐ ์ง์ ์ํธ์์ฉํ์ง ์๋ ์์ ์ ์ฒ๋ฆฌํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์ ์ด ํฌ๊ทธ๋ผ์ด๋์ ์์ด๋ ๊ณ์ํด์ ๋์ํ ์ ์์ต๋๋ค.
- ์ฃผ๋ก ๋คํธ์ํฌ ํธ๋์ญ์ ์ฒ๋ฆฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ํ์ผ ๋ค์ด๋ก๋, ์์ ๊ฐ์ ์ฅ๊ธฐ ์คํ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์ ํฉํฉ๋๋ค.
์๋น์ค ๊ฐ์ | Background work | Android Developers
๋ณ๋์ ์ค๋ ๋
- ๊ณต์๋ฌธ์์๋ ์๋น์ค ์ฌ์ฉ ์ ์ฃผ์์ฌํญ์ผ๋ก ์๋ ๋ด์ฉ์ ๋ช ์ํ๊ณ ์์ต๋๋ค.
์๋น์ค๋ ๋ณ๋์ ์ค๋ ๋๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด ํธ์คํ ํ๋ก์ธ์ค์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํ๋ฉ๋๋ค. ์ฆ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ ์์ ์ ๋ฉ์ธ ์ค๋ ๋์์ ์คํํ๋ ๊ฒฝ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉ์ถ๊ณ ANR ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
Foreground Service
- Foreground Service๋ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ์ธ์๋๋ฉฐ, ์๋ฆผ์ ํตํด ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ ์ค์์ ํ์ํ๋ ์๋น์ค์ ๋๋ค.
- ์์ ์ฌ์, ํ์ผ ๋ค์ด๋ก๋, GPS ์ถ์ ๊ณผ ๊ฐ์ ์์ ์ ์ฌ์ฉ๋๋ฉฐ ์ฐ์ ์์๊ฐ ๋ฎ์ ์์คํ ๋ฆฌ์์ค๊ฐ ๋ถ์กฑํ๋๋ผ๋ ์ฝ๊ฒ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
- ์๋น์ค๋ฅผ ์ค์งํ๊ฑฐ๋ ํฌ๊ทธ๋ผ์ด๋์์ ์ ๊ฑฐํ์ง ์๋ ํ ์๋ฆผ์ ํด์ ํ ์ ์์ต๋๋ค.
class MyForegroundService : Service() {
override fun onCreate() {
super.onCreate()
val notification = NotificationCompat.Builder(this, "channel_id")
.setContentTitle("Foreground Service")
.setContentText("Running in the foreground")
.setSmallIcon(R.drawable.ic_notification)
.build()
startForeground(1, notification) // Foreground ์๋น์ค ์์
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// ๋ฐฑ๊ทธ๋ผ์ด๋ ์์
์ํ
return START_STICKY
}
override fun onDestroy() {
super.onDestroy()
}
override fun onBind(intent: Intent?): IBinder? {
return null
}
}
Background Service
- ์ฌ์ฉ์๊ฐ ์ง์ ์ธ์ํ์ง ์๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ ์๋น์ค์ ๋๋ค.
- Android 8.0 ์ด์์๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์คํ์ ์ ํ์ด ์์ด, ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ WorkManager ๋๋ Foreground Service๋ก ๋์ฒดํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
val serviceIntent = Intent(this, MyBackgroundService::class.java)
startService(serviceIntent)
Bound Service
- Activity, Fragment์ ๊ฐ์ ๋ค๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ปดํฌ๋ํธ์ ๋ฐ์ธ๋ฉ๋์ด ์ํธ์์ฉํ๋ ์๋น์ค์ ๋๋ค.
- ์ฃผ๋ก ํด๋ผ์ด์ธํธ - ์๋ฒ ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ฉฐ, ์๋น์ค๋ ์๋ช ์ฃผ๊ธฐ๊ฐ ํด๋ผ์ด์ธํธ์ ์ข ์๋ฉ๋๋ค.
- Activity ๋๋ Fragment๊ฐ ์๋น์ค์ ๋ฐ์ธ๋ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
class MyBoundService : Service() {
private val binder = LocalBinder()
inner class LocalBinder : Binder() {
fun getService(): MyBoundService = this@MyBoundService
}
override fun onBind(intent: Intent?): IBinder {
return binder
}
fun performTask(): String {
return "Task completed"
}
}
// Activity์์ ๋ฐ์ธ๋ฉ
class MyActivity : AppCompatActivity() {
private lateinit var service: MyBoundService
private var bound = false
private val connection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, binder: IBinder) {
val localBinder = binder as MyBoundService.LocalBinder
service = localBinder.getService()
bound = true
}
override fun onServiceDisconnected(name: ComponentName) {
bound = false
}
}
override fun onStart() {
super.onStart()
Intent(this, MyBoundService::class.java).also { intent ->
bindService(intent, connection, Context.BIND_AUTO_CREATE)
}
}
override fun onStop() {
super.onStop()
if (bound) {
unbindService(connection)
bound = false
}
}
}
์๋น์ค ์๋ช ์ฃผ๊ธฐ
- ์๋น์ค๋ ์๋ช ์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ํตํด ์ํ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
onCreate
- ์๋น์ค๊ฐ ์ฒ์ ์์ฑ๋ ๋ ํธ์ถ๋๋ฉฐ, ์ด๊ธฐํ ์์ ์ ์งํํ ์ ์์ต๋๋ค.
onStartCommand
- ์๋น์ค๊ฐ ์์๋ ๋ ํธ์ถ๋ฉ๋๋ค.
- ์ฃผ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์์ํ๋ ๊ณณ์ด๋ฉฐ, ์๋น์ค์ ๋์ ๋ฐฉ์์ ๊ฒฐ์ ํ๋ ๋ฐํ ๊ฐ์ ๊ฐ์ง๋๋ค.
- START_STICKY : ์๋น์ค๊ฐ ๊ฐ์ ๋ก ์ข ๋ฃ๋์ด๋ ์์คํ ์ด ์ฌ์์์ ์๋ํฉ๋๋ค.
- START_NOT_STICKY : ๊ฐ์ ์ข ๋ฃ๋ ์๋น์ค๋ ๋ค์ ์์๋์ง ์์ต๋๋ค.
- STRAT_REDELIVER_INTENT : ์๋น์ค๊ฐ ๊ฐ์ ์ข ๋ฃ๋ ๊ฒฝ์ฐ, ๋ง์ง๋ง ์ธํ ํธ๋ฅผ ๋ค์ ์ ๋ฌ ๋ฐ์ต๋๋ค.
onBind
- ๋ฐ์ด๋ ์๋น์ค์์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ธ๋ฉํ ๋ ํธ์ถ๋ฉ๋๋ค.
onUnBind
- ๋ฐ์ด๋๋ ์ปดํฌ๋ํธ๊ฐ ๋ฐ์ธ๋ฉ์ ํด์ ํ ๋ ํธ์ถ๋ฉ๋๋ค.
onDestroy
- ์๋น์ค๊ฐ ์ข ๋ฃ๋๊ธฐ ์ง์ ์ ํธ์ถ๋ฉ๋๋ค.
์ ๋ฆฌ
- Service๋ ์๋๋ก์ด๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ์ค์ํ ์ปดํฌ๋ํธ์ ๋๋ค.
- Foreground Service๋ ์ฌ์ฉ์์๊ฒ ๋ช ํํ ์ธ์๋๋ ์์ ์ ์ ํฉํ๋ฉฐ, Background Service๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ด์ง ์์ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- Bound Service๋ ํด๋ผ์ด์ธํธ - ์๋ฒ ๊ตฌ์กฐ์์ ์ฌ์ฉ๋๋ฉฐ ํน์ ์ปดํฌ๋ํธ์ ๋ฐ์ธ๋ฉ๋์ด ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค.
- Android 8.0๋ถํฐ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์๋น์ค ์ฌ์ฉ์ ๋ํ ์ ์ฝ์ด ๊ฐํ๋์์ต๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ ์ํํ๋ ค๋ฉด Foreground Service๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ WorkManager์ ๊ฐ์ ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.