Service

똘이주인·2021년 7월 27일
0
  • 어플리케이션을 구성하는 4대 컴포넌트 중에 하나
  • 액티비티처럼 사용자와 상호인터렉션 하는 컴포넌트가 아니라, 사용자 몰래 화면뒷단에서 동작하는 컴포넌트
  • 백그라운드에서 동작하는 컴포넌트
  • 액티비티와 다르게 UI가 존재하지 않는다.
  • 서비스의 시작과 종료는 다른서비스, Activity, BroadCast Receiver를 포함한 다른 Application에서 가능.
  • ****만약 서비스가 실행되고 있는 상태라면, 안드로이드 OS 에선 왠만하면 프로세스를 죽이지 않고 관리한다.

Service가 필요한 이유

  • 예를 들어 Activity가 Pause되거나, 화면에 없어지는 경우(Stop) 음악이 계속흘러나와야 하는 할 때 / 파일 다운로드 해야할 때
  • 화면 뒷단 즉--> 백그라운드 영역에서 작업을 해야하는 경우
  • 사용자로 부터의 특별한 지시가 필요하지 않은 경우.
    음악을 재생시킨다. --> 음악이 흘러나온다. (특별한 지시가 있을 때까지 음악을 재생시킨다.)
  • 어플리케이션이 실행 중이지 않을 때도 작업해야하는 경우 서비스를 사용.
    (어플리케이션이 실행 중일 때만 작업해야하는 경우 스레드권장)

서비스의 3가지 유형

  1. 백그라운드

    백그라운드는 이름 그대로 사용자에게 직접 보이지 않는 작업을 수행한다.

    액티비티가 사용자에게 직접 보이는 화면이라면

    서비스는 뒤에서 필요한 작업을 수행한다.

    애플리케이션을 꺼도 백그라운드 서비스는 계속 수행할 수 있다.

  2. 바인더

    바인딩을 위한 서비스이다.

    이름 그대로 여러 구성 요소(예를 들면 Acticity)를 서비스에 바인딩하여

    서비스와 상호작용할 수 있다.

    클라이언트-서버 유형과 비슷하다고 생각할 수 있다.

    액티비티와 서비스는 따로 운영될 수 있지만

    서로 바인딩하여 통신할 수도 있다.

    bindService()를 호출하여 사용한다.

    바인딩이 해제되면 해당 서비스는 소멸된다.

  3. 포그라운드

    서비스는 포그라운드로도 실행할 수 있다.

    포그라운드는 이름 그대로 사용자에게 직접 보이는 작업을 수행한다.

    오디오 앱을 예로 들면 트랙을 재생할 때 포그라운드 서비스를 사용한다.

    포그라운드인데 왜 서비스냐? 사용자가 다른 앱을 사용중이어도 계속해서 실행되도록 하기 때문이다.

    서비스 생명 주기 (Service LifeCycle)

    서비스에는 크게 두 종류의 형태가 있다. 서비스의 생명주기는 다음의 두 path 에 따라 달라진다.

    • startService()로 서비스를 실행하거나
    • bindService()로 바인딩만 제공하는 경우
    1. Strated Service

      서비스가 액티비티와 같은 컴포넌트가 startService() 메소드를 호출할때 시작된다. 그리고 이것은 백그라운드에서 무기한으로 동작한다. 한번 시작된 서비스는 stopService() 메소드가 호출되면 정지한다. 서비스는 stopSelf() 메소드를 호출하여 자기자신을 정지시킬 수 있다.

    2. Bound Service

      서비스가 다른 컴포넌트(예를 들면 cilent 컴포넌트와 같은)가 bindService() 메소드를 호출할때 bind 된다. client 는 unbindService() 메소드를 호출하여 서비스를 unbind 할 수 있다. 서비스는 client 가 unbind 할때까지 멈출 수 없다.

    서비스의 기본 콜백 메소드

    1. onStartCommand()

      서비스를 시작하도록 요청하는 메소드이다.

      서비스를 실행하려는 곳(예를 들면 Activity)에서 startService()를 써서 호출된다.

      이 메소드가 실행되면 서비스가 시작되고 백그라운드에서 무한히 실행될 수 있다.

      서비스를 중단하는 것은 stopSelf() 또는 stopService()를 써서 호출하면 된다.

      바인딩만 제공하고자 하는 경우에는 onStartCommand()를 구현하지 않아도 된다.

    2. onBind()

      다른 구성 요소와 서비스를 바인딩하려는 경우에 호출한다.

      바인딩을 실행하려는 곳(예를 들면 Activity)에서 bindService()를 써서 호출된다.

      구현을 할 때는 Interface를 제공해야 한다.

      return으로 IBinder를 반환하면 된다.

      이 메소드는 항상 구현해야 한다.

      구현을 하는데 바인딩을 하지 않으면 return값으로 null을 반환하면 된다.

    3. onCreate()

      onStartCommand() 또는 onBind()를 호출하기 전에 호출한다.

      onStartComannd() 또는 onBind()에서 서비스를 실행하거나 바인딩을 하고 나면

      서비스가 계속해서 실행되고 있는 중이 되기 때문에

      일회성으로 실행되며, 서비스가 이미 실행 중이면 onCreate()는 호출되지 않는다.

    4. ondestroy()

      서비스를 소멸시킬 때 호출한다.

      각종 리소스를 정리하기 위해 구현해야 한다.

    서비스의 선언

    <manifest>
       <application>
          <service android:name=".MyService"/>
       </application>
    </manifest>
    

    서비스는 다른 애플리케이션과도 상호작용할 수 있는데, Manifest에서 서비스를 비공개로 선언하고 다른 애플리케이션으로부터의 액세스를 차단할 수도 있다.

    android:exported="false"를 추가하면 서비스를 본인의 앱에서만 사용 가능하게 할 수 있다.

    android:description 특성을 추가해서 서비스에 대한 설명을 기재할 수도 있다.

0개의 댓글