* 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 |