서비스는 백그라운드에서 동작하는 컴포넌트로 메인 스레드에서 동작한다.
액티비티와 서비스 양쪽에 10초동안 1초마다 컴포넌트의 이름을 출력하는 코드를 작성을 할 경우 액티비티에서 startService를 실행함과 동시에 반복문으로 'Activity'를 출력하는 코드를 실행하면, 어느 한 쪽의 코드가 끝나야만 다른 쪽 코드가 실행된다.
그러나 동일한 코드를 백그라운드 스레드로 작성하면 2개의 컴포넌트 이름(Service, Activity)이 뒤섞여서 출력이 된다.
Q) 왜 서비스와 다른 컴포넌트의 동작이 뒤섞이면 안되는 지는 모르겠다...
서비스는 액티비티와의 연결 관계에 따라 두 가지 형태로 실행된다.
① 스타티드 서비스 (Started Service)
② 바운드 서비스 (Bound Service)
1) 스타티드 서비스 (Started Service)
액티비티와 상관없이 독립적으로 동작할 때 사용한다. 액티비티의 종료와 무관하게 동작하므로 일반적으로 많이 사용하는 서비스이다.
2) 바운드 서비스 (Bound Service)
액티비티와 값을 주고받을 필요가 있을 때 사용한다. 여러 개의 액티비티가 같은 서비스를 사용할 수 있어서 기존에 생성되어 있는 서비스를 바인딩해서 재사용할 수 있다. 액티비티와 값을 주고 받을 때에는 사용하고 값을 주고받기 위한 인터페이스를 제공한다.
그러나, 인터페이스 사용이 복잡하고 연결된 액티비티가 종료되면 서비스도 같이 종료되는 문제로 잘 사용되지는 않는다. 단, 액티비티 화면이 떠 있는 상태에서 백그라운드 처리도 함께할 경우에는 스타티드 서비스보다 효율적일 수 있다.
위와 같이 스타티드 서비스와 바운드 서비스를 만들었다.
바운드 서비스를 만들기 전, 스타티드 서비스만 먼저 만들었을 때는 스타티드 서비스에서 메서드가 호출이 되었다. 하지만, 바인드 서비스를 이후에 만들고 실행시켰을 때는 바운드 서비스에서만 메서드가 호출이되고 스타티드 서비스에서는 메서드가 호출되지 않는 것을 확인할 수 있었다.
Q) 바운드 서비스를 만들었을 때, 스타티드 서비스에서는 메서드를 호출하지 못하는 이유는 무엇일까?
위에서와 같이 서비스는 시작 방식을 기준으로 스타티드 서비스와 바운드 서비스로 분류된다.
서비스는 시작 방식뿐만 아니라 실행 구조를 기준으로도 나눌 수 있다.
① 포어그라운드 서비스
② 백그라운드 서비스
기본적으로 서비스는 모두 백그라운드 서비스이다.