스레드
작업을 동시에 실행할 수 있는 클래스이다. Thread를 상속받거나, Runnable을 구현하여 사용할 수 있다. 스레드는 하나의 독립적인 실행 흐름을 가지며, 일반적으로 긴 작업을 수행하는 데 사용한다. 스레드는 수동으로 관리해야 하기 때문에 관리가 어렵고 코드를 읽기 어려워질 수 있다는 단점이 있다.
스레드를 사용하는 경우
- 중간 또는 많은 양의 데이터가 포함된 네트워크 작업 (업로드 또는 다운로드)
- 백그라운드에서 실행해야하는 높은 CPU 작업
- GUI 스레드와 관련된 CPU 사용량을 제어하려는 모든 작업
서비스
서비스는 백그라운드에서 실행시간이 긴 작업을 수행하며, 사용자 인터페이스를 제공하지 않는 어플리케이션 구성요소이다. UI가 없는 작업이긴 하지만, 작업시간이 너무 길지 않아야 하며, 긴 작업이 필요하다면 서비스 내에서 스레드를 사용해야 한다.
| 스레드 | 서비스 |
| 백그라운드 프로세스를 수행할 수 있는 OS 수준의 기능 | 대부분 UI 없이 백그라운드에서 오래 실행되는 작업 |
| 자체 스레드에서 실행됨 | 메인 스레드에서 실행됨 |
| 스레드는 경량 프로세스이고 안드로이드 컴포넌트가 아니다. | 서비스는 안드로이드 컴포넌트이고, 액티비티지만 인터페이스가 없다. |
| UI 스레드를 업데이트할 수 없다. 업데이트를 위해서는 핸들러가 필요하다 | UI 업데이트가 가능하다. |
| 액티비티 생명주기에서 실행되며 액티비티가 파괴되면 종료/중지된다. | 서비스는 백그라운드에서 실행되며 액티비티 생명주기와 독립적인 자체 생명주기를 갖는다. 따라서 액티비티가 파괴될 때 서비스가 명시적으로 중지되지 않는 한 서비스는 계속 실행된다. |