π Android μ 4λ ꡬμ±μμ Serviceμ λν΄ μμ보μ!
λ€μ΄κ°κΈ° μ μ
λ°±κ·ΈλΌμ΄λμμ λμνλ κΈ°λ₯μ ꡬννκΈ° μν΄ μλλ‘μ΄λμ Service κ°λ μ μ΄ν΄κ° νμνμλ€. μμ§ μλΉμ€λ₯Ό μ¬μ©νλ κΈ°λ₯μ ꡬνν΄λ³Έ κ²½νμ΄ μμ΄μ κ°λ λΆν° μ νν μ΄ν΄νκΈ° μν΄ λ΄μ©μ μ 리ν΄λ³΄λ € νλ€!!
μλΉμ€λ?
μλ 2κ°μ§ λ¬Έμ₯μΌλ‘ μ 리νμ.
1. μ¬μ©μμ μνΈμμ©νμ§ μμΌλ©΄μ μ€λ μ€νλλ μμ μ μν
2. λ€λ₯Έ μ±λ€μ΄ μ¬μ©ν μ μλ κΈ°λ₯μ μ 곡
μλΉμ€λ λ€λ₯Έ μ± κ°μ²΄μ²λΌ νΈμ€ν νλ‘μΈμ€μ λ©μΈ μ€λ λμμ μ€νλλ€.
λ°λΌμ μλΉμ€μμ CPU μ§μ½μ μ΄κ±°λ λΈλ‘νΉ μμ (MP3 μ¬μ, λ€νΈμνΉ)μ μμ μ ν΄μΌνλ€λ©΄ λ³λμ μ€λ λμμ ν΄λΉ μμ μ μ€νν΄μ€μΌνλ€.
μ¬κΈ°μ νΈμ€ν νλ‘μΈμ€λ μλΉμ€κ° μ€νλκ³ μλ νλ‘μΈμ€λ₯Ό λ§νλ€.
μλλ‘μ΄λ μ±μ λ³΄ν΅ νλμ νλ‘μΈμ€ μμμ μ€νλλλ° κ·Έ νλ‘μΈμ€μμμ λ€μν κ΅¬μ± μμλ€μ΄ λμνκ² λλ€.
μλΉμ€λ κ·Έ νλ‘μΈμ€ μμμ μ€νλλ νλμ ꡬμ±μμμ΄λ€.
μλΉμ€μ λν μ€ν΄ 2κ°μ§!!
β μλΉμ€λ λ³λμ νλ‘μΈμ€μ΄λ€.
μλΉμ€ κ°μ²΄ μ체λ‘λ μμ λ§μ νλ‘μΈμ€μμ μ€νλλ€λ μλ―Έκ° μκ³ κΈ°λ³Έμ μΌλ‘ μμ μ΄ μν μ ν리μΌμ΄μ μ νλ‘μΈμ€ μμμ μ€νλλ€λ κ²μ΄λ€.
β μλΉμ€λ μ€λ λμ΄λ€.
μλΉμ€ μμ²΄κ° λ©μΈ μ€λ λ μΈλΆμμ μμ μ μννλ μλ¨μ΄ μλλΌλ λ»μ΄λ€. μ¦ ANRμ λ°©μ§νκΈ° μν μλ¨μ΄ λμ§ λͺ»νλ€!!
κ²°λ‘ μ μλΉμ€λ νλ‘μΈμ€λ μ€λ λκ° μλλΌ λ¨μν μ ν리μΌμ΄μ μ΄ λ°±κ·ΈλΌμ΄λμμ μμ μ μννκ±°λ λ€λ₯Έ μ±μ μμ μ κΈ°λ₯μ λ ΈμΆμν€λ κΈ°λ₯μ μ 곡νλ κ²μΌλΏμ΄λΌλ κ²μ κΈ°μ΅νμ!
μλΉμ€κ° μ 곡νλ 2κ°μ§ κΈ°λ₯
1. μ ν리μΌμ΄μ μ΄ λ°±κ·ΈλΌμ΄λμμ μμ μ μννκ³ μΆμ λ μμ€ν μ μλ €μ£Όλ κΈ°λ₯
-> Context.startService()λ₯Ό ν΅ν΄ μν
2. μ ν리μΌμ΄μ μ΄ μμ μ κΈ°λ₯μ λ€λ₯Έ μ ν리μΌμ΄μ μ λ ΈμΆμν€λ κΈ°λ₯
-> Context.bindService() λ₯Ό ν΅ν΄ μλΉμ€μ μ₯κΈ°μ μΈ μ°κ²°μ λ§Ίμ μ μλ€.
μ¬κΈ°μ μ ν리μΌμ΄μ μ μ± μ 체λ₯Ό μλ―Ένλ€. μλΉμ€λ₯Ό ν΅ν΄ λ€λ₯Έ μ±λ€μκ² λ΄ κΈ°λ₯μ λ ΈμΆμν¬ μ μλ κ²μ΄λ€.
μ.. κ·Όλ° μ΄ λ§λ§ λ£κ³ λ μμ§ μ λλ‘ μ΄ν΄κ° λμ§ μλλ€.
μμλ₯Ό ν΅ν΄ μ΄ν΄ν΄λ³΄μ!!
λ©μ μ μ±μμ μ¬μ©μκ° μμ
μ 곡μ νκ³ μΆμ λ μμ
νλ μ΄μ΄ μ±μ μλΉμ€λ₯Ό μ΄μ©ν΄μ μμ
μ μ¬μν μ μκ² νλ κ²μ μκ°ν΄λ³΄μ
μ΄λ κ² μλΉμ€λ₯Ό ν΅ν΄ λ€λ₯Έ μ±λ€μ νΉμ κΈ°λ₯μ μ¬μ©ν μ μκ² ν΄μ£Όλ κ²μ μλ―Ένλ€.
μλΉμ€μ μμ±
μλΉμ€ μμ±λλ€λ©΄ λκ° λ¬΄μ§λ§μ§νκ² κ±°μ°½ν μΌμ΄ μΌμ΄λ κ²λ§ κ°λ€!!
νμ§λ§ μλλ€~ μμ€ν μ λ¨μν μλΉμ€ κ°μ²΄λ₯Ό μμ±νκ³ onCreate() μ½λ°±μ νΈμΆν λΏμ΄λ€.
μλΉμ€μ μ’ λ₯
1. ν¬κ·ΈλΌμ΄λ μλΉμ€
ν¬κ·ΈλΌμ΄λ μλΉμ€λ λ¨μ΄ κ·Έλλ‘ μ¬μ©μκ° μΈμ§ν μ μλ μμ μ μ€ννλ μλΉμ€μ΄λ€.
μ νλΈ ν리미μμ λ μ¬λ €λ³΄μ μ± μ μ²΄κ° νλ©΄μ 보μ΄μ§ μμλ ν¬κ·ΈλΌμ΄λ μλΉμ€λ₯Ό ν΅ν΄ μμμ΄λ λ Έλλ₯Ό κ³μ μ¬μν μ μλ€.
ν¬κ·ΈλΌμ΄λ μλΉμ€λ₯Ό μ¬μ©ν λμλ λ°λμ μλ¦Όμ νμν΄μ€μΌνλ€. λν μ΄ μλ¦Όμ μλΉμ€λ₯Ό μ€μ§νκ±°λ ν¬κ·ΈλΌμ΄λμμ μμ νμ§ μλ ν λ«μ μ μλ€.
2. λ°±κ·ΈλΌμ΄λ μλΉμ€
λ°±κ·ΈλΌμ΄λ μλΉμ€λ ν¬κ·ΈλΌμ΄λ μλΉμ€μ λ¬λ¦¬ μ¬μ©μκ° μΈμ§νμ§ λͺ»νλ μμ
μ μ€ννλ μλΉμ€λ₯Ό λ§νλ€.
3. λ°μΈλ©λ μλΉμ€
μ ν리μΌμ΄μ κ΅¬μ± μμκ° bindService()λ₯Ό νΈμΆνλ©΄ μλΉμ€μ λ°μΈλ©λλ€.
κ·ΈλΌ μλΉμ€λ ν΄λΌμΈμΈνΈ-μλ² μΈν°νμ΄μ€λ₯Ό μ 곡νκ² λμ΄μ κ΅¬μ± μμλ€μ΄ μλΉμ€μ μνΈμμ©νκ³ μμ²μ 보λ΄κ³ κ²°κ³Όλ₯Ό λ°μ μ μκ² λλ€.
λλ ν νλ©΄μ μμΉ μλΉμ€μ λ°μΈλ©νμ¬, μμΉ μλΉμ€κ° λμ μ€μΈμ§ μ€μ§ μνμΈμ§μ λ°λΌ ννλ©΄μμ 보μ΄λ UI μμμ λ°μν΄μ£Όκ³ μλ€.
λν νλ‘μΈμ€ κ° ν΅μ (IPC)μ ν΅ν΄μ, μ¦ μλ‘ λ€λ₯Έ νλ‘μΈμ€μ μλ κ΅¬μ± μμλ€λ μλΉμ€λ₯Ό λ§€κ°λ‘ λ°μ΄ν°λ₯Ό μ£Όκ³ λ°μ μ μλ€.
λ°μΈλ©λ μλΉμ€λ λ€λ₯Έ ꡬμ±μμκ° λ°μΈλ©λ κ²½μ°μλ§ μ€νλκ³ , λͺ¨λ ꡬμ±μμκ° λ°μΈλ©μ ν΄μ νλ©΄ μλΉμ€λ μλ©Ένλ€.
μμλ μλΉμ€μ λ°μΈλ©λ μλΉμ€
- onStartCommand() : ꡬμ±μμκ° μμν μ μλλ‘ νμ©ν΄μ€λ€
- bindService() : μλΉμ€μ κ²°ν©νλ κ²μ νμ©ν΄μ€λ€.
μλΉμ€ μ½λ°± λ©μλ
κ·Έλ¬λ©΄ μ΄μ μλΉμ€μ κ΄λ ¨λ μ½λ°± λ©μλλ₯Ό μμ보μ~!!
1. onStartCommand
μ‘ν°λΉν°μ κ°μ λ€λ₯Έ ꡬμ±μμκ° μλΉμ€ μμμ μμ²νκΈ° μν΄ startServiceλ₯Ό νΈμΆνκ² λλ©΄
μλΉμ€μ onStartCommandκ° νΈμΆλλ€!
μ΄ λ©μλκ° μ€νλλ©΄ μλΉμ€κ° μμλκ³ λ°±κ·ΈλΌμ΄λμμ 무기νμΌλ‘ μ€νλ μ μλ€.
λ°λΌμ λ§μ½ μλΉμ€λ₯Ό μ€μ§νκ³ μΆλ€λ©΄ stopSelf λλ stopServiceλ₯Ό νΈμΆν΄μ€μΌνλ€.
2. onBind
λ€λ₯Έ ꡬμ±μμ(μ : μ‘ν°λΉν°) κ° μλΉμ€μ μ°κ²°νκ³ μΆμ΄!! νλ©΄μ κ²°ν©(λ°μΈλ©)μ μνλ€λ©΄ μμ€ν μ bindServiceλ₯Ό νΈμΆνλ€.
ν΄λΉ λ©μλκ° νΈμΆλλ©΄ μλΉμ€μ onBind λ©μλκ° νΈμΆλλ€.
onBind λ©μλλ₯Ό ꡬνν λμλ IBinderμ λ°ννλ©° ν΄λΌμ΄μΈνΈ(μλΉμ€μ μ°κ²°νκ³ μΆμ μ‘ν°λΉν°)κ° μλΉμ€μ ν΅μ νλλ° μ¬μ©λλ μΈν°νμ΄μ€λ₯Ό μ 곡ν΄μΌνλ€.
μ½λλ μ΄λ κ² μκ²ΌλΉ
override fun onBind(intent: Intent?): IBinder? {
return LocationBinder()
}
μ΄ λ©μλλ λ°λμ ꡬνν΄μΌνκ³ , λ§μ½ μλΉμ€μμ μ°κ²°μ μνμ§ μλλ€λ©΄ nullμ 리ν΄ν΄μΌνλ€.
3. onCreate
onCreateλ μ‘ν°λΉν°μμλ 맨λ 보μμ μ½λ°± λ©μλμ΄λ€.
μλΉμ€μμμ onCreate λ©μλλ μ΄λ€μ§ νλ² μμ보μ
onCreate λ μλΉμ€κ° μ²μ μμ±λ λ 1λ²λ§ νΈμΆλλ λ©μλμ΄λ€. λ°λΌμ μλΉμ€μ μ΄κΈ° μ€μ μμ λ€μ μννκ² λλ€.
λ§μ½ μλΉμ€κ° μ΄λ―Έ μ€νμ€μ΄λΌλ©΄? μ΄ λ©μλλ νΈμΆλμ§ μκ³ onStartCommandλ onBindκ° λ¨Όμ λΆλ¦¬κ² λλ€.
4. onDestroy
onDestroyλ μμ€ν μ΄ λμ΄μ μλΉμ€λ₯Ό μ¬μ©νμ§ μκ³ νκ΄΄ν λ νΈμΆλλ λ©μλμ΄λ€.
κ°λ°μλ€μ μ΄ λ©μλμμ μλΉμ€κ° μ¬μ©νκ³ μλ 리μμ€, μ€λ λλ λ±λ‘λ 리μ€λ, μμ κΈ° λ±μ μ 리νλ©΄ λλ€.
μ΄ λ©μλλ μλΉμ€κ° νκ΄΄λκΈ° μ§μ μ νΈμΆλλ λ§μ§λ§ μ½λ°± !! λ°λΌμ μλΉμ€ μ’ λ£ μ λ§μ§λ§μΌλ‘ μ 리ν μ μλ κΈ°νμ΄λ€.
μ¬μ§μΌλ‘ 보면 μλμ κ°λ€ (μΆμ²λ μλ 곡μλ¬Έμ)
μλΉμ€μ λμ μΈμ μΌκΉ?
- λ§μ½ μλΉμ€κ° startServiceλ‘ μμ±λμλ€λ©΄ κ·Έλ‘μΈν΄ onStartCommandκ° νΈμΆλμλ€λ©΄
μλΉμ€μ λμ κ·Έ μμ²΄λ‘ stopSelfλ₯Ό νΈμΆνκ±°λ λ€λ₯Έ ꡬμ±μμμ μν΄ stopServiceκ° νΈμΆλ λμ΄λ€
- λ§μ½ μλΉμ€κ° bindServiceλ‘ μμ±λμλ€λ©΄ onStartCommandκ° νΈμΆλμ§ μμλ€λ©΄
μλΉμ€λ ꡬμ±μμμ μ°κ²°λμ΄μλ ν κ³μλλ€. λ§μ½ μλΉμ€κ° λͺ¨λ ν΄λΌμ΄μΈνΈμ μ°κ²°μ΄ λμ΄μ§λ©΄ μμ€ν μ μλΉμ€λ₯Ό μλ©Έμν¨λ€.
μλΉμ€μ μμ
μλΉμ€κ° μμλλ©΄ μλΉμ€μ μλͺ μ£ΌκΈ°λ μλΉμ€λ₯Ό μμ±ν ꡬμ±μμμλ λ 립μ μΈ μλͺ μ£ΌκΈ°λ₯Ό κ°μ§λ€.
κ·Έλμ μλΉμ€λ μμν ꡬμ±μμκ° νκ΄΄λλλΌλ κ³μν΄μ λ°±κ·ΈλΌμ΄λμμ 무기νμΌλ‘ μ€νλ μ μλ€.
μ μ΄μ μ½λλ₯Ό ν΅ν΄ μλΉμ€λ₯Ό μ΄λ»κ² μμνλμ§ μμ보μ
μ΄λ κ² μλΉμ€ μΈν νΈλ₯Ό λ§λ€μ΄μ£Όκ³ intentμ actionκ³Ό ν¨κ» startForegroundServiceλ₯Ό νΈμΆν΄μ£Όμλ€.
val locationIntent = Intent(context, LocationForegroundService::class.java).apply {
action = "START_LOCATION_SERVICE"
}
context?.startForegroundService(locationIntent)
startForegroundServiceκ° νΈμΆλλ©΄ μλΉμ€ λ΄μ onStartCommand λ©μλκ° νΈμΆλκ³ intentλ‘ μ λ¬λ actionμ λ°λΌ λμμ μννκ² ν΄μ£Όμλ€.
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
when (intent?.action) {
"START_LOCATION_SERVICE" -> {'''}
}
μ£Όμν μ
μλΉμ€λ₯Ό λ©μΈ μ€λ λμμ μ€ννκ² λλ©΄ λ¬Έμ κ° λ°μν μ μλ€...!
μ νν μ΄λ€ λ¬Έμ λ νλ©΄ . .
μλΉμ€λ κΈ°λ³Έμ μΌλ‘ λ©μΈ μ€λ λμμ λμκ°λ μ΄ν리μΌμ΄μ κ³Ό κ°μ νλ‘μΈμ€μμ λμνλ€.
μ¦ μλΉμ€λ λ©μΈ μ€λ λμμ λμκ°λ€. κ·Έλ° μ€λ λμμ μ§μ€μ μ΄κ³ , λΈλ‘νΉμ λμμ μννλ©΄μ κ°μ μ ν리μΌμ΄μ μ μλ μ‘ν°λΉν°μ UIκ° μ¬μ©μμ μνΈμμ©νκ³ μλ€λ©΄ μλΉμ€λ μ‘ν°λΉν° μ±λ₯μ μ νμν¨λ€!!
μ΄λ° μ±λ₯ μ νλ₯Ό λ§κΈ° μν΄μλ μλΉμ€ λ΄λΆμμ μλ‘μ΄ μ€λ λλ₯Ό μμνλ κ²μ΄ μ’λ€.
λ§λ¬΄λ¦¬
μ΄μ 본격μ μΌλ‘ λ°±κ·ΈλΌμ΄λ κΈ°λ₯μ ꡬνν΄λ³Ό μ°¨λ‘λ€! κ·Έ κ³Όμ μ λ€μ κΈμμ λ€λ€λ³΄λλ‘ νλΉ