반응형

Activity와 Service는 안드로이드 4대 컴포넌트로써 Activity는 startActivity()를, Service는 Context.startService() 또는 bindService()를 사용하여 실행할 수 있습니다.

이렇듯 안드로이드 프레임워크가 제공하는 컴포넌트는 우리가 new 키워드를 통해서 직접 생성하는 것이 아닙니다.

 

액티비티 여러 번 호출시(when to start Activity multiple)

아마 여러분 중 많은 분들이 startActivity()를 통해서 액티비티를 실행해 본 경험이 있으실 겁니다.

혹시 동일한 액티비티가 여러 겹 쌓이는 경험도 해보셨나요?

액티비티는 startActivity()로 호출하게 되면 새로운 인스턴스가 생성되고, 인스턴스 하나당 새로운 레이아웃이 바인딩되기 때문에 별도의 화면으로 취급합니다.

그렇기 때문에 액티비티를 종료하는 finish() 메소드를 호출한다고 해서 같은 클래스의 모든 액티비티 인스턴스가 종료되는 것이 아니라는 것이죠!

 

서비스 여러 번 호출시(when to start Service multiple)

그렇다면 서비스는 어떨까요?

안드로이드 개발자들의 교과서인 developer 사이트에 따르면 서비스는 여러번 호출되어도 인스턴스가 하나입니다!

어떻게 이게 가능한가 생각이 드실 수 있는데, 앞서 말한 것처럼 안드로이드 컴포넌트들에 대해서 생성을 우리가 직접 하지 않기 때문에 가능한 거죠!

(사실 모든 프레임워크가 그렇듯 개인이 개발 못할 건 또 없습니다. 다만 프레임워크가 그 번거로움을 해소해줄 뿐)

 

그렇다면 이미 서비스가 실행되어 있는 상태에서는 startService()가 무시될까요?

아닙니다. 이미 서비스가 있더라도 호출이 되는 순간 onStartCommand() 메소드가 실행되고, 만약 이를 실행할 수 없는 상태라면 onCreate() 메소드를 실행하고서 대기하게 됩니다.

 

인스턴스가 하나이기 때문에 Service 클래스에서 멤버 변수로 선언한 변수들을 유지하고 있을 테고, 이를 활용해 내가 원하는 로직을 실행하도록 컨트롤할 수 있겠습니다.

 

만약 내가 기존의 인스턴스를 메모리 해제하고서 새로운 인스턴스를 만들고 싶다면?

안드로이드 서비스는 stopSelf() 또는 Context.stopService()를 실행하기 전까지는 인스턴스가 메모리 해제되지 않기 때문에 만약 새로운 인스턴스를 생성하고 싶으시다면 stopSelf() 또는 context.stopService() 메소드를 실행하신 후에 다시 서비스를 호출하시면 되겠습니다.

반응형
반응형