* AsyncTask

> Background Thread 를 실행시키는 비동기 Task 이다



* Service


> 지역 서비스

- 같은 프로세스에서 실행 (같은 UI Thread, 같은 Heap 공간)


> 전용 원격 서비스

- 원격 프로세스에서 실행 (다른 UI Thread ,다른 Heap 공간)

- App 이 속한 구성요소에만 접근 

- Binder Mechanism 을 사용하여 동작


> 전역 원격 서비스

- 원격 프로세스에서 실행 (다른 UI Thread ,다른 Heap 공간)

- 다른 App 에도 노출

- IntentFilter 를통해 접근 가능



* Service 를 이용한 비동기 Task 수행


> Service 를 이용하지 않고, Activity 나 BR 에서 BG Thread 를 사용하는 경우 아래 2가지의 위험이 있다


1) Activity, BR 가 종료 되더라도 BG Thread 가 Job 을 계속 수행하는 경우, Activity 는 빈 프로세스로 남아있을 수 있다 (Memory Leak)

- BR 에서 아래 메소드를 호출하는 경우에는 종료되지 않고, result.finish() 가 호출되기 전까지 비동기가 유지될 수 있다


public void onReceive() {

PendingResult result = goAsync();


public void run() {

result.finish();

}

}


2) Process 가 종료 될 때, Activity, BR 에서 실행한 BG Thread 에서 Job 이 진행 중인데, FG 에서 활성화된 다른 Job 이 없다면, 

Thread 가 중단되고 Activity, BR 가 종료되고,  빈 프로세스로 남아있을 수 있다


> 따라서, 서비스를 이용하여 BG Thread 를 수행하면 Memory Leak 을 최소화 할 수 있다


1) Service 는 가능한 필요한 만큼만 실행을 통해, Memory Leak 을 최소화 할수 있다 (비교적

-  Thread 가 Outer Class Object 에 대해 참조를 가지고 있기 때문에


2) stopSelf() 로 서비스가 종료되는 경우, 서비스의 Life Cycle 은 Process Task 에서 관리하게 된다

BG Thread 가 활성화된 상태이므로, Service 도 BG Thread 가 종료될 때까지 같이 살아 있게 된다



* Intent Servcie


> 서비스 생명주기 + BG Thread Task 처리를 내장

> Single Background Thread 에서 Task 실행

> BG Task 실행자는 Handler Thread 

- 이를 통해, onHandleIntent() 를 수행

> stopSelf() 로 중지시킬 필요가 없다. 내부적으로 수행

> UI Thread 에서 BG Thread 로 Task 를 넘기고 싶을 때 적합

> BG job 의 output 은 PendingIntent 나 Notification 을 통해 전달 가능



* Service vs Intent Service


> Service

- startCommand() 는 UI Thread 에서 실행됨

> Intent Service

- onHandleIntent() 는 BG Thread 에서 실행됨

'SW > Android' 카테고리의 다른 글

//View  (0) 2020.06.20
//RecyclerView  (0) 2020.05.23
AsyncQueryHandler 와 Loader  (0) 2019.09.08
IPC (Inter Process Communication)  (0) 2019.09.07
Thread, Looper And Handler  (0) 2019.09.07

+ Recent posts