[Components] Service

Greenddoovie·2021년 12월 17일
0

안드로이드

목록 보기
4/8

화면 없이 백그라운드에서 돌아가는 컴포넌트로 Activity가 종료된 상태에서도 동작하기 위해 만들어진 컴포넌트이며 Bound Service를 사용하면 Activity 종료 시 같이 종료된다.
Android의 컴포넌트이므로 System에서 관리하고, Manifest 파일에 등록해서 System에 알려야 한다

서비스는 Foreground Service, Background Service, BindService로 나뉜다.

서비스는 Main Thread에서 관리하기 때문에 Thread 작업이 필요한 경우에는 작업 Thread를 생성해서 관리해줘야 한다. 그렇지 않으면 ANR이 발생하여 종료되는 문제가 발생한다.

Foreground / Background Service (- Unbound Service)

startService()함수를 호출하여 실행된다.
stopSerivce()를 호출하여 멈출 수도 있고, service내부에서 stopSelf()를 호출하여 멈출 수 있다.

생명주기

첫 실행일 때, onCraete() -> onStartCommand() -> onDestroy()의 생명주기를 가진다.
이미 Service가 실행 중 일 때는, onStartCommand()가 호출된다.
값을 바꾸려면, startCommand의 intent param에 원하는 값을 넣어서 호출한다.

Flag

startService의 인자로 flag를 넣을 수 있는데 flag 종류로 START_STICKY, START_NOT_STICKY, START_REDELIVER_INTENT가 있다.
START_STICKY는 서비스가 강제 종료되었을 경우, 기존 intent에 value 값이 설정되어 있었다고 하더라도, 재시작 시 intent 값을 null로 초기화시켜 재시작한다.
START_NOT_STICKY는 강제로 종료된 서비스가 재시작하지 않는다. 그러므로 강제 종료되어도 괜찮은 작업에 쓰인다.
START_REDELIVER_INTENT는 START_STICKY와 같은 동작이지만, 재시작 시 마지막에 사용된 intent 값을 그대로 가져와 사용한다.

API 26 | 백그라운드 실행 제한

앱이 백그라운드에 있는 경우, 백그라운드 서비스는 수 분 이내에 무조건 destroy 된다.
따라서 죽지 않는 서비스를 만들기 위한 우선 조건은 백그라운드 서비스가 아닌 포어그라운드 서비스로 만들어야 한다는 것이다.

Bind Service (- Bound Service)

bindService() 함수를 호출하여 실행
unbindService() 함수를 호출하여 종료

다양한 액티비티에서 바인드 할 수 있다.
프로세스간 통신에 사용된다.
연결된 모든 액티비티가 사라지면 서비스도 소멸한다
애플리케이션의 내부 기능을 외부에 제공할 때에 많이 사용된다.

생명주기

onCraete() -> onBind() -> onUnbind() -> onDestroy()의 생명주기를 갖는다.

Intent Service

onStartCommand()에 전달된 모든 인텐트 실행을 위한 작업 스레드를 생성한다.
전달된 인텐트는 작업을 위한 큐에 차례대로 쌓이고 루퍼에 의해서 차례로 onHandleIntent()에 전달된다.
이 작업이 완료되면 서비스를 종료한다. 따라서 별도의 멀티 스레딩 처리를 고민하지 않아도 된다.
onStartCommand()는 반드시 오버라이딩을 하고 super.onStartCommand()를 호출해야 한다. 일반 서비스보다는 함수가 적어 훨씬 간결하다는 특징이 있다.

생명주기





서비스 시작 + 바인딩도 허용하는 서비스의 수명주기


여전히 서비스가 실행중일 때 bindService가 호출되었고 이전에 bind된 적이 있다면, onUnbind()가 true를 반환한다.


공부 후 내용 추가

Service는 bindService와 startService로 시작할 수 있다.
또한 bindService는 이미 시작되어 있는 service에 연결할 수 있다.

서비스를 start한 componenet와 service가 소통하는 방법은 service에서 broadcast를 보내고 broadcast receiver가 받음으로서 소통할 수 있다.

boundService와 binding component가 소통하는 방법은 bind할 때 IBinder 객체를 포함하여 보내고 return값으로 보낸 IBinder객체를 받는다. IBinder를 이용하여 서비스와 소통을 주고받는다

profile
기초를 이해하면 세상이 다르게 보인다

0개의 댓글