외로운 Nova의 작업실

안드로이드 앱 프로그래밍 - 27(서비스 이해하기) 본문

Programming/Kotlin - Android

안드로이드 앱 프로그래밍 - 27(서비스 이해하기)

Nova_ 2023. 2. 16. 11:45

- 서비스

서비스는 오래 걸리는 작업을 백그라운드에서 처리할 수 있게 해주는 컴포넌트입니다. 따라서 화면을 구현하지않고 서비스 역시 안드로이드의 컴포넌트이므로 생명주기를 시스템에서 관리합니다.

 

- 서비스 생성과 실행

서비스 컴포넌트는 Service 클래스를 상속받아서 작성합니다. 다양한 생명주기 함수를 재정의할 수 있지만 onBind()는 필수 입니다. 아래는 생성 예시입니다.

class Myservice: Service(){
    override fun onBind(intent: Intent?): IBinder? {
        return null
    }
}

서비스도 컴포넌트이므로 매니페스트에 등록해야합니다. 만일 암시적 인텐트로 하려면 intent-filter 태그를 등록해줍니다.

<service android:name=".Myservice"
      android:enabled="true"
      android:exported="true"></service>

서비스를 실행할떄는 2가지 함수가 있는데 startService()함수와 bindService()함수가 있습니다. 둘의 차이점을 알아보겠습니다.

 

<startService() 함수 실행>

//서비스 실행
val intent = Intent(this, Myservice::class.java)
startService(intent)

만약 외부앱의 서비스라면 setPackage()함수를 이용해 앱의 패키지명을 명시해줍니다.

//서비스 실행
val intent = Intent("ACTION_OUTER_SERVICE")
intent.setPackage("com.example.test_outter")
startService(intent)

서비스를 종료하려면 아래와 같이 코딩합니다.

stopService(intent)

 

<bindService() 함수로 실행>

bindService()함수에는 serviceConnection 객체를 매개변수로 줘야합니다. 따라서 serviceConnection 객체를 미리 만들어야합니다. 아래는 객체를 만든 모습입니다.

	val connection: ServiceConnection = object : ServiceConnection{
       			override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
                TODO("Not yet implemented")
            }

            override fun onServiceDisconnected(name: ComponentName?) {
                TODO("Not yet implemented")
            }
        }

ServiceConnection 객체에는 추상 함수가 2개 정의되어있습니다. onServiceConnected함수는 bindService()함수로 서비스를 구동할때 자동으로 호출되며 onServiceDisconnected() 힘수는 서비스를 종료할때 자동으로 호출됩니다. 아래는 bindService()함수 서비스 실행코드입니다.

        val intent = Intent(this, Myservice::class.java)
        bindService(intent, connection, Context.BIND_AUTO_CREATE)

마지막 매개변수 Context.BIND_AUTO_CREATE는 플래그값으로 실행상태가 아니더라도 객체를 생성해서 실행하라는 의미입니다. 이값을 넣지않으면 서비스가 실행상태가 아니면 동작하지않습니다. 아래는 서비스 종료 코드입니다.

unbindService(connection)

 

- 생명주기

 

startService()함수로 객체를 생성하면 onCreate()함수와 onStartCommand()함수가 실행됩니다. 이후 다시 startService()함수를 호출하면 onStartCommand()함수만 실행됩니다. 

bindService()함수도 마찬가지로 객체를 생성하면 onCreate()함수와 onBind()함수가 실행됩니다. 이후 bindService()함수를 호출하면 onBind()함수만 실행됩니다.

Comments