Android(안드로이드) 5. 안드로이드 Component - Service

차선호·2023년 6월 15일
0

Android

목록 보기
5/5
post-thumbnail

Service


  • 일반적으로 화면 없이 동작하는 프로그램으로 Background 서비스

  • 사용자와 상호작용 할 수 없음

  • 액티비티의 생명주기에 종속되어 있지 않다. (각자 안드로이드 컴포넌트라서)

  • 별도의 스레드에서 동작하지 않고 호스팅 프로세스의 메인 스레드에서 작동

    • bindService는 연결할 때와 해제할 때만 백그라운드 스레드에서 처리되고 onServiceConnected와 onServiceDisconnected는 메인 쓰레드에서 호출
  • 액티비티가 비활성화 되면 액티비티보다 우선순위가 높음

  • 8버전 이후로는 백그라운드에서 장시간 동작시 시스템에서 강제 종료

    • 회피하려면 APP의 작동을 Notification 영역에 표시하는 Foreground 서비스가 되어야 함
  • startService 또는 bindService로 실행시킬 수 있음


startService


동작 방식

  • 앱 내의 액티비티 같은 컴포넌트가 호출했을 때 실행

  • 백그라운드에서 한 가지 일을 하며, 결과를 호출했던 컴포넌트에게 보내지 않음

  • 예 - 다운로드, 파일 업로드

생명 주기

  • 회색 부분 - 액티비티에서 호출

  • 초록색 부분은 서비스 시작되고 순서대로 호출

    • 시작되면 onCreate( ) → onStrartCommand( )

    • 중지되면 onDestory( )

  • onCreate( )

    • 서비스가 최초 초기화 될 때 호출
  • onStartCommand( )

    • 서비스를 다른 컴포넌트가 호출했을 때 수행

    • 이 메서드를 통해 서비스가 백그라운드에서 동작

    • 리턴 값

      • START_NOT_STICKY - 서비스가 시스템에 의해 종료될 때 PendingIntent가 따로 있지 않다면 다시 생성하지 않음
      • START_STICKY(default) - 시스템에 의해 종료되어도 다시 생성(마지막 인텐트는 전해주지 않음)
      • START_REDELEVER_INTENT - 마지막 인텐트까지 모두 유지하며 다시 생성
  • onDestroy

    • 서비스가 소멸될 때 호출

    • stopService( )나 stopSelf( )가 호출되면 서비스가 동작을 멈추고 시스템이 onDestroy 함


bindService


동작 방식

  • startService와 다르게 자신을 호출했던 컴포넌트와 인터랙션을 주고 받을 수 있음

  • 처리한 결과를 주고 받을 수 있음

  • 서로 다른 프로세스 상에 있어도 처리 가능

  • a 앱이 있고 b 앱이 있으면 프로세스도 다르고 VirtualMachine도 다르다. 이때, 서로 데이터를 주고 받으려면 프로세스 간 통신을 해야 한다.

  • startService( )와 달리 하나 이상의 클라이언트 컴포넌트 간의 통신을 구현 가능

생명 주기

  • bindService( )로 실행

  • onCreat( ) → onBind( )가 호출되면서 Running 상태가 됨

    • 이때 Binder를 반환해준다.

    • 액티비티 쪽에서onServiceConnected 함수에서 Binder를 받아서 사용

  • unbindService( )를 호출하면 onUnbind( ) → onDestroy( ) 순서로 호출됨

  • 액티비티의 onStart( )에서 bindService( ) 해주고 onStop( )에서 unbindService( ) 호출

bindServcie 구현 방법

  • Local

    • Binder 클래스의 서브 클래스 생성해서 구현

    • onBind 함수에서 서비스의 IBinder 객체 반환

  • Remote

    • Messenger와 Handler 사용

      • 안드로이드 프레임워크에서 정형화로 제공하는 것

      • Handler 상속한 클래스 구현해서 현재 스레드에 할당된 looper 객체를 만들고 onBind에서 걔의 binder를 액티비티로 건네준다. 이때 Messenger의 객체를 통해서 주고 받는다.

      • 액티비티는 Bundle에 키 값의 데이터를 넣고 Message 객체에 값을 세팅해서 반환 받은 service.send 함수를 통해 메시지를 전달

      • Handler 상속할 때 handleMessage 메서드 오버라이딩 하면서 메시지를 수신했을 때 처리할 동작 구현

    • AIDL 사용

      • Handler 방식은 순차적으로 Task를 처리하여 멀티 쓰레드가 안되지만 AIDL을 사용하면 멀티 쓰레드 지원 가능

      • AIDL 파일 생성

      • 인터페이스 구현

        • Android SDK는 AIDL 파일 기반으로 java 언어로 인터페이스 생성해 줌

        • 해당 인터페이스는 Binder를 상속

        • AIDL 인터페이스 메서드를 구현해주는 Stub이라는 내부 추상 클래스가 있는데 이를 확장하고 메서드 구현해야 함

      • Activity에서 서비스 바인딩

        • Service를 구현하고 onBind( )를 오버라이딩하여 Stub 추상 클래스를 상속받은 클래스의 객체 생성하여 반환

        • Activity에서 구현한 서비스 바인딩

Foreground Service

  • 활성화된 액티비티와 동급의 우선순위를 가짐

  • 상태바에 알림을 표시해야 함 - Notification

    • 알림콘텐츠 설정 및 알람의 탭 작업 설정 - NotificationBuilder, PendingIntent 사용

    • 채널 만들기 및 중요도 설정

    • 알림 표시

  • API 28 이상 부터는 Manifest에 android.permission.FOREGROUND_SERVICE 명시해줘야 함

  • 액티비티에서 startService로 호출하고 해당 서비스에서 onStartCommand에서 startForeground 호출하면 foreground service 시작

Notification

  • 화면을 사용하지 않고 사용자에게 알림 기능을 제공

  • Channel을 생성

    • getSystemService를 통해 Manager 획득한 후 channel 등록
  • Notification 생성 후 NotificationManager를 통해 전송

    • PendingIntent, builder, icon, title 등을 세팅
profile
dkssud!

0개의 댓글