๋ชฉ์ฐจ
๋ก์ง์ ๋ณ๊ฒฝํ๊ฒ ๋ ๋ฐฐ๊ฒฝ
๊ธฐ์กด ์์น ๋ฐ์ดํฐ๋ฅผ ์๋ฆผ์ผ๋ก ๋ณด์ฌ์ฃผ๋ ๋ก์ง์ ์์ ํด์ฃผ์๋ค.
์๋ ๋ด์ฉ๊ณผ ๊ฐ์ด ๊ธฐ์กด์๋ ์ธก์ ๋ ์์น ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์๋ฆผ์ ์ ๋ฐ์ดํธํด์ฃผ๋ ๋ฐฉ์์ด์๋ค.
๊ทธ๋ฌ๋ ๊ฑด์ค ํ๊ฒฝ์ ๊ทผ๋ก์๋ถ๋ค์ด ๋งค๋ฒ ์์น ๋ด์์ ์์น๋ฅผ ํ์ธํ ๊ฐ๋ฅ์ฑ์ด ์ ๊ณ ์ด๋ ์๋ฒ๋ก ์ ์ก๋์ด ๊ด๋ฆฌ์๋ถ๋ค์ด ํ์ธํด์ฃผ๋ ํ๋ก์ธ์ค์์๋ ๊ธฐ์กด ๋ฐฉ์์ด ๋ถํ์ํ๋ค๊ณ ํ๋จํ์๋ค. ๋ํ ๋ฐฐํฐ๋ฆฌ ์๋ชจ์จ๋ ๋ง์๋ ๋ฐฉ์์ด๋ผ ๋ณ๊ฒฝ์ด ํ์ํ๋ค๊ณ ์๊ฐํ๋ค!
๋ฐ๋ผ์ ์ฑ์ด ํ๋ฉด์ ๋ณด์ผ ๋๋ง ๊ฐ์ฅ ์ต๊ทผ์ ์ฃผ์๊ฐ์ ์กํฐ๋นํฐ์์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํ๊ฒ ๋์๋ค.
์๋น์ค์์ ์กํฐ๋นํฐ๋ก ๋ฐ์ดํฐ ์ ์ก
ํฌ๊ทธ๋ผ์ด๋ ์๋น์ค๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ธก์ ํ๊ณ ์์๊ธฐ ๋๋ฌธ์ ์กํฐ๋นํฐ๊ฐ ํ๋ฉด์ ๋ณด์ด๋ ์ํ๊ฐ ๋๋ฉด ๊ฐ์ฅ ์ต๊ทผ์ ์์น ๋ฐ์ดํฐ๋ฅผ ์กํฐ๋นํฐ๋ก ์ ๋ฌํ๋ ์์ ์ด ํ์ํ๋ค.
์ด๋ฅผ ์ํด "๋ฐ์ธ๋ ๋ ์๋น์ค" ๊ฐ๋ ์ ์ฌ์ฉํ์๋ค.
class LocationForegroundService : Service() {
// ๊ฐ์ฅ ์ต๊ทผ ์์น ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํ ๋ณ์
private var lastLocation : Location? = null
// ์๋น์ค์์ ์กํฐ๋นํฐ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ๋ด๋ถ ํด๋์ค ์์ฑ
// LocationBinder๋ LocationForegroundService๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๊ธฐ ์ํ getService ๋ฉ์๋๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํด์ค๋ค.
// ์ด๋ฅผ ํตํด ํด๋ผ์ด์ธํธ์์ ์๋น์ค์ getLastLocation() ์ ํธ์ถํ ์ ์๋ค
inner class LocationBinder :Binder() {
fun getService() : LocationForegroundService {
// ํ์ฌ ์๋น์ค ๊ฐ์ฒด ๋ฐํ
return this@LocationForegroundService
}
}
์ด ๋ ๊ทธ๋ฅ return LocationForegroundSerivce() ๋ฅผ ํ๊ฒ ๋๋ฉด ๋ฆฌํด์ ๋ฐ์ดํฐ ์ ๋ฌ์ด ๋์ง ์๊ณ null๋ก ๋ด์๋ค.
return์์๋ ํ์ฌ ์๋น์ค ๊ฐ์ฒด๋ฅผ ์ ๋ฌํด์ค์ผํ๋ค!
์กํฐ๋นํฐ์์ ๋ฐ์ดํฐ๋ฅผ ์ป์ ์ ์๋๋ก ๊ณต๊ฐ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด์ฃผ์๋ค. lastLocation์๋ ๊ฐ์ฅ ์ต๊ทผ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด์๋ค.
fun getLastLocation() : Location? {
return lastLocation
}
๊ทธ๋ฆฌ๊ณ ์๋น์ค์ onBind ์ฝ๋ฐฑ ๋ฉ์๋์์ Binder ์ธ์คํด์ค๋ฅผ ๋ฐํํด์ค๋ค.
override fun onBind(intent: Intent?): IBinder? {
return LocationBinder()
}
// bindService ๋ฉ์๋์ ๋๊ฒจ์ค ์๋น์ค ๋ฐ์ธ๋ฉ ์ฝ๋ฐฑ์ ์ ์ํด์ค๋ค.
private val connection = object : ServiceConnection{
override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
val binder = service as LocationForegroundService.LocationBinder
locationService = binder.getService()
bound = true
}
override fun onServiceDisconnected(name: ComponentName?) {
bound = false
}
}
์๋น์ค์ ์ฐ๊ฒฐํด์ค๋ค.
private fun startLocationService() {
Intent(applicationContext, LocationForegroundService::class.java).also { intent ->
startForegroundService(intent)
bindService(intent,connection,Context.BIND_AUTO_CREATE)
}
}
๊ทธ๋ฆฌ๊ณ ์์ ์๋น์ค์์ ์ ์ํด์ค ํจ์๋ฅผ ํธ์ถํ์ฌ ์๋, ๊ฒฝ๋ ๊ฐ์ ์ป๊ณ ์ด๋ฅผ ํตํด ์ฃผ์๋ฅผ ๊ฐ๊ณตํด์ฃผ์๋ค.
// ์ฃผ์ ๊ฐ๊ณตํด์ฃผ๊ธฐ
private fun updateLocationDisplay() {
if (bound) {
lastLocation = locationService.getLastLocation()
์ด ๋ ์ฃผ์๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒ์ ํ๋ฉด์ ์ฑ์ด ๋ณด์ผ ๋์ฌ์ผํ๋ค.
๋ฐ๋ผ์ onStart ๋ด๋ถ์์ ์ฑ์ด ํ๋ฉด์ ๋ณด์ด๊ณ , ์๋น์ค์ ์ฐ๊ฒฐ๋ ๊ฒฝ์ฐ์๋ง ์ ๋ฐ์ดํธ ํจ์๋ฅผ ํธ์ถ๋๋๋ก ๊ตฌํํด์ฃผ์๋ค.
override fun onStart() {
super.onStart()
if(bound) {
updateLocationDisplay()
}
}
// ๋ค์
override fun onResume() {
super.onResume()
Intent(this,LocationForegroundService::class.java).also {intent->
startForegroundService(intent)
bindService(intent,connection, Context.BIND_AUTO_CREATE)
}
if(bound) {
updateLocationDisplay()
}
}
// ๋ง์ฝ ํ๋ฉด์ ๋ณด์ด์ง ์์ผ๋ฉด ์ฐ๊ฒฐ์ ํด์ ํ๋ค.
override fun onStop() {
super.onStop()
if (bound) {
unbindService(connection)
bound = false
}
}
๊ฒฐ๊ณผ ์์!!
'๐ค2024 ์๋๋ก์ด๋ > โ๏ธ ํ๊ณ ์ธํด ๊ฐ๋ฐ ํ๋ก์ ํธ ๊ธฐ๋ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
1์ฃผ์ฐจ ๊ฐ๋ฐ์ผ์ง (0) | 2024.12.17 |
---|---|
โ๏ธ ์์น ๋ฐ์ดํฐ ์ธก์ ํ ๋ ์ฃผ์์ (0) | 2024.11.02 |
lifecycleScope.launch๋ ๋ฉ์ธ ์ค๋ ๋์์๋ง ๋์๊ฐ๊น? (1) | 2024.09.10 |
var๊ณผ val์ ์ฐจ์ด๋ฅผ ์์๋์? (0) | 2024.09.10 |
๋ฐ์ดํฐ ์ ์ก ์๋ ๊ธฐ๋ก (0) | 2024.08.29 |