[Kotlin] 서비스

taeyang·2020년 9월 18일
0

서비스는 백그라운드에서 동작하는 컴포넌트로 메인 스레드에서 동작한다.

액티비티와 서비스 양쪽에 10초동안 1초마다 컴포넌트의 이름을 출력하는 코드를 작성을 할 경우 액티비티에서 startService를 실행함과 동시에 반복문으로 'Activity'를 출력하는 코드를 실행하면, 어느 한 쪽의 코드가 끝나야만 다른 쪽 코드가 실행된다.

  • 서비스로 동작할 때 로그캣
    Acivity
    Acivity
    Acivity
    ... 10번 완료 후
    Service
    Service
    ...

그러나 동일한 코드를 백그라운드 스레드로 작성하면 2개의 컴포넌트 이름(Service, Activity)이 뒤섞여서 출력이 된다.

  • 백그라운드 스레드로 동작할 때 로그캣
    Activity
    Service
    Service
    Activity
    Service
    ...

서비스의 동작은 한 쪽의 코드가 끝나고 나서 다른 쪽 코드가 실행되어야 하므로 기존의 백그라운드 처리와는 다른 개념으로 접근해야 한다.

Q) 왜 서비스와 다른 컴포넌트의 동작이 뒤섞이면 안되는 지는 모르겠다...



1. 서비스의 실행방식

서비스는 액티비티와의 연결 관계에 따라 두 가지 형태로 실행된다.

① 스타티드 서비스 (Started Service)
② 바운드 서비스 (Bound Service)

1) 스타티드 서비스 (Started Service)
액티비티와 상관없이 독립적으로 동작할 때 사용한다. 액티비티의 종료와 무관하게 동작하므로 일반적으로 많이 사용하는 서비스이다.

  • 메서드 : startService( )

2) 바운드 서비스 (Bound Service)
액티비티와 값을 주고받을 필요가 있을 때 사용한다. 여러 개의 액티비티가 같은 서비스를 사용할 수 있어서 기존에 생성되어 있는 서비스를 바인딩해서 재사용할 수 있다. 액티비티와 값을 주고 받을 때에는 사용하고 값을 주고받기 위한 인터페이스를 제공한다.
그러나, 인터페이스 사용이 복잡하고 연결된 액티비티가 종료되면 서비스도 같이 종료되는 문제로 잘 사용되지는 않는다. 단, 액티비티 화면이 떠 있는 상태에서 백그라운드 처리도 함께할 경우에는 스타티드 서비스보다 효율적일 수 있다.

  • 메서드 : bindService( )



2. 스타티드 서비스와 바운드 서비스 만들기

위와 같이 스타티드 서비스와 바운드 서비스를 만들었다.

바운드 서비스를 만들기 전, 스타티드 서비스만 먼저 만들었을 때는 스타티드 서비스에서 메서드가 호출이 되었다. 하지만, 바인드 서비스를 이후에 만들고 실행시켰을 때는 바운드 서비스에서만 메서드가 호출이되고 스타티드 서비스에서는 메서드가 호출되지 않는 것을 확인할 수 있었다.

Q) 바운드 서비스를 만들었을 때, 스타티드 서비스에서는 메서드를 호출하지 못하는 이유는 무엇일까?



3. 포어그라운드 서비스

위에서와 같이 서비스는 시작 방식을 기준으로 스타티드 서비스와 바운드 서비스로 분류된다.

서비스는 시작 방식뿐만 아니라 실행 구조를 기준으로도 나눌 수 있다.

① 포어그라운드 서비스
② 백그라운드 서비스

기본적으로 서비스는 모두 백그라운드 서비스이다.

  • 포어그라운드 서비스의 구성
  1. AndroidManifest.xml 파일에 포어그라운드 서비스 권한을 명세해야 한다.
  2. 서비스가 먼저 실행되어야 한다.
  3. 서비스 안에서 startForeground( ) 메서드를 호출해서, 서비스가 포어그라운드로 실행되고 있다는 것을 안드로이드에게 알려줘야 한다.




(☞゚ヮ゚)☞ [참고서적] 이것이 안드로이드다 with 코틀린 / 고돈호 / 한빛미디어
profile
Tyangpedia

0개의 댓글