티스토리 뷰


서비스를 실행하는 방법은 두 가지

 1) startService를 호출

 2) bindService를 호출

각 방법에 따른 생명주기는 다음과 같다. 


< 두 갈래 서비스 생명주기 > 


startService로 실행한 서비스는 백그라운드에서 돌아가면서 서비스를 실행한 컴포넌트와는 관계가 없어지고, bindService를 통해 실행된 서비스는 서비스를 실행한 컴포넌트와 데이터를 주고 받을 수 있는 bind된 관계가 된다. 한 서비스는 여러개의 컴포넌트와 bind가 될 수 있으며 unbind를 통해 컴포넌트와 연결을 해제한다. 


그런데 bindService로 실행한 서비스를 notification을 통해 startForeground로 메모리 상에서 kill되지 않도록 해줬음에도 해당 액티비티가 종료되었을 때 서비스가 종료되는 현상이 있었다. bindService로 실행한 서비스는 연결된 모든 컴포넌트와 unbind 될 시 종료되는데 처음 시작한 액티비티를 끄면 자동적으로 unbind되는 듯. 


해결법은 startService에 있었다. startService와 bindService는 동시에 사용될 수 있다는 정보를 입수, 먼저 startService로 서비스를 실행하고 바로 bindService도 해주어 액티비티가 종료되어도 서비스가 destroy되지 않고 액티비티와 통신도 가능하게끔 해주고 테스트해보니 성공. (서비스를 통해 MediaPlayer로 음원재생하는 기능)


서비스와 액티비티간 통신은 

액티비티->서비스 : 액티비티에서 서비스 내 메소드 직접 호출

서비스->액티비티 : BroadcastRecevier 이용

추가로 서비스와 Notification간의 통신은

서비스->노티피케이션 : 서비스내에서 노티피케이션 메소드 호출

노티피케이션->서비스 : pendingIntent 이용 (서비스의 콜백함수 onStartCommand가 호출된다)


이제 서비스를 실행한뒤 액티비티를 껏다 다시 들어왔을 때 돌아가고 있는 서비스에서 데이터를 액티비티에 전해주어 진행상황을 UI로 표시해주는 작업이 남았는데 여기에는 서비스의 onRebind가 이용될 듯. 아래의 생명주기처럼 서비스가 bind되었다가 액티비티를 종료하면서 unbind되면 onUnbind가 호출되는데 이때 true값을 리턴해주면 다음에 bind되었을 때 onBind가 아니라 onRebind가 호출되는 듯 하니 여기서 액티비티로 데이터를 전송해주면 되지 않을까 예상해본다.


< 바인드 된 서비스 생명주기 >



참고 

1. https://developer.android.com/guide/components/bound-services.html#Lifecycle

2. https://developer.android.com/guide/components/services.html



댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함