일반적으로 화면 없이 동작하는 프로그램으로 Background 서비스
사용자와 상호작용 할 수 없음
액티비티의 생명주기에 종속되어 있지 않다. (각자 안드로이드 컴포넌트라서)
별도의 스레드에서 동작하지 않고 호스팅 프로세스의 메인 스레드에서 작동
액티비티가 비활성화 되면 액티비티보다 우선순위가 높음
8버전 이후로는 백그라운드에서 장시간 동작시 시스템에서 강제 종료
startService 또는 bindService로 실행시킬 수 있음
앱 내의 액티비티 같은 컴포넌트가 호출했을 때 실행
백그라운드에서 한 가지 일을 하며, 결과를 호출했던 컴포넌트에게 보내지 않음
예 - 다운로드, 파일 업로드
회색 부분 - 액티비티에서 호출
초록색 부분은 서비스 시작되고 순서대로 호출
시작되면 onCreate( ) → onStrartCommand( )
중지되면 onDestory( )
onCreate( )
onStartCommand( )
서비스를 다른 컴포넌트가 호출했을 때 수행
이 메서드를 통해 서비스가 백그라운드에서 동작
리턴 값
onDestroy
서비스가 소멸될 때 호출
stopService( )나 stopSelf( )가 호출되면 서비스가 동작을 멈추고 시스템이 onDestroy 함
startService와 다르게 자신을 호출했던 컴포넌트와 인터랙션을 주고 받을 수 있음
처리한 결과를 주고 받을 수 있음
서로 다른 프로세스 상에 있어도 처리 가능
a 앱이 있고 b 앱이 있으면 프로세스도 다르고 VirtualMachine도 다르다. 이때, 서로 데이터를 주고 받으려면 프로세스 간 통신을 해야 한다.
startService( )와 달리 하나 이상의 클라이언트 컴포넌트 간의 통신을 구현 가능
bindService( )로 실행
onCreat( ) → onBind( )가 호출되면서 Running 상태가 됨
이때 Binder를 반환해준다.
액티비티 쪽에서onServiceConnected 함수에서 Binder를 받아서 사용
unbindService( )를 호출하면 onUnbind( ) → onDestroy( ) 순서로 호출됨
액티비티의 onStart( )에서 bindService( ) 해주고 onStop( )에서 unbindService( ) 호출
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에서 구현한 서비스 바인딩
활성화된 액티비티와 동급의 우선순위를 가짐
상태바에 알림을 표시해야 함 - Notification
알림콘텐츠 설정 및 알람의 탭 작업 설정 - NotificationBuilder, PendingIntent 사용
채널 만들기 및 중요도 설정
알림 표시
API 28 이상 부터는 Manifest에 android.permission.FOREGROUND_SERVICE 명시해줘야 함
액티비티에서 startService로 호출하고 해당 서비스에서 onStartCommand에서 startForeground 호출하면 foreground service 시작
화면을 사용하지 않고 사용자에게 알림 기능을 제공
Channel을 생성
Notification 생성 후 NotificationManager를 통해 전송