728x90
반응형
참고 교재 : Joyce의 안드로이드 앱 프로그래밍 - 홍정아
전체 코드가 궁금하다면 아래 링크를 참고하시길 바랍니다.
원본 코드 : Joyce의 안드로이드 앱 프로그래밍 - 홍정아
이번에는 지난번 뮤직 플레이어(MusicPlayer)_1편에 이어서 2편입니다.
프로젝트 진행 전 알아야할 사전지식2에 대해 정리하는 글입니다.
2. 사전지식 : 서비스와 생명주기
- 서비스 : 백그라운드에서 꺼지지 않고 작업을 수행하는 안드로이드 4대 구성요소 중 하나, 독립된 구성요소로 독립된 생명 주기를 가집니다. → 액티비티가 소멸되더라도 서비스는 독립된 상태로 실행됩니다., 서비스를 사용하기 위해서는 AndroidManifest.xml에 직접 추가해야합니다.
- 서비스의 유형에는 3가지가 있습니다. 시작된 서비스, 바인드된 서비스, 시작되고 바인드된 서비스
1. 시작된 서비스
- 서비스를 시작하기 위해 startService()함수를 액티비티나 다른 서비스에서 실행해야합니다.
- startService()를 호출 → 서비스 시작 → 서비스 내의 콜백 메서드인 onCreate() & onStartCommand()가 차례로 호출 → 시작된 상태
- 한 번 시작된 상태의 서비스는 계속 실행 중인 상태로 존재합니다.
- 서비스를 중지하려면?
- stopSelf() 함수로 알아서 중지하거나 다른 구성요소가 stopService()를 호출하여 명백하게 종료합니다.
- 서비스를 종료하면 onDestroy()함수가 호출되어 서비스가 완전히 종료됩니다.
- 서비스를 중지하려면?
- 아무리 많은 구성요소에서 startService()를 호출하더라도 서비스 객체는 하나만 생성됩니다.
- onCreate() 함수 또한 서비스를 만들 때 처음에만 호출 → 딱 한 번만 수행되어야 하는 작업은 onCreate() 함수를 이용합니다.
2. 바인드된 서비스
- 바인드된 서비스
- 바인드가 된 서비스는 다른 구성요소와 연결이 가능합니다.( ex) 액티비티가 서비스와 바인딩 → 액티비티는 서비스에 정의된 함수 사용 가능, 서비스에 요청을 보내 응답을 받을 수 있습니다.)
- 다른 앱의 구성요소가 서비스에 접근할 수 있도록 만듭니다.
- 바인드된 서비스는 기본적으로 바인드된 동안에만 실행 → 계속 백그라운에서 실행 되지 않습니다.
- 사례 : 음악 앱에서 서비스 실행 후 음악 재생 → 앱을 나가더라도 계속 재생 → 다시 앱을 실행 → 액티비티와 서비스가 바인드 → 재생 컨트롤
- 바인드가 된 서비스는 다른 구성요소와 연결이 가능합니다.( ex) 액티비티가 서비스와 바인딩 → 액티비티는 서비스에 정의된 함수 사용 가능, 서비스에 요청을 보내 응답을 받을 수 있습니다.)
코드
- 액티비티에서 bindService() 함수 호출할 때 Service Connection 구현 객체, Context.BIND_AUTO_CREATE를 인수로 줌 → 인텐츠 객체, 서비스 연결 관련 정보를 받을 수 있습니다.
- BIND_AUTO_CREATE : bindService()함수를 실행했을 때 서비스가 없으면 서비스의 onCreate() 콜백 함수를 실행시켜 서비스를 생성합니다.
- 구성요소가 서비스와 연결되면 onServiceConnected() 함수가 호출 → IBinder 객체를 전달받습니다.(서비스와 통신을 가능케합니다.)
- 생명주기
- 다른 구성요소에서 bindService() 호출 → 만약 서비스가 없다면 onCreate() 를 실행합니다.
- onBind()가 호출 → 서비스는 IBinder 인터페이스 구현 객체를 bindService() 호출한 구성요소에 전달 → IBinder를 받은 이후 상호작용 가능합니다.
- 연결된 모든 구성요소들이 unBindService() 호출 → 서비스와 연결을 끊음 → onUnbind() 실행 → onDestroy() 호출 → 완전히 서비스 종료합니다.
- 시작된 서비스와 바인드된 서비스의 차이
- 시작된 서비스
- 다른 구성요소와 연결고리가 없습니다.
- 단순히 startService()를 실행해 서비스 시작, stopService()로 서비스를 멈춥니다.
- 바인드된 서비스
- IBinder 인터페이스를 매게로 다른 구성요소와 소통합니다.
- bindService()는 unbindService()를 호출하여 연결을 끊게 되면 서비스를 종료합니다.
- 계속 살아있어야 하는 태스크에는 부적절합니다.
- 시작되고 바인드된 서비스
- 대부분 시작되고 바인드된 서비스를 함께 사용 : 백그라운드에 남아있는 동시에 다른 구성요소와 연결되어 소통합니다.
- 실행 방법 : startService()와 bindService() 함수 둘 다 실행하면 됩니다.
- 시작된 서비스
- 포그라운드 서비스 & 백그라운드 서비스
- 서비스를 만들게 되면 startService() 함수 자주 사용 → startService()함수만으로 코드 작성시 런타임 에러 발생 → ‘java.lang.IllegalStateException: Not allowed to start service Intent' → 백그라운드 서비스 실행에 제한을 둔다는 내용 → 안드로이드 API 레벨 26(안드로이드 O) 이상으로 타깃 SDK를 설정하면 발생하는 에러입니다.
- 포그라운드 서비스 : 앱이 실행 중일 때 상태 표시줄에 알림이 표시되어 사용자가 서비스가 실행 중임을 능동적으로 인지할 수 있는 서비스입니다.
- 백그라운드 서비스 : 사용자가 보이지 않는 곳에서 조용히 작업 수행, 많은 앱이 백그라운드 서비스를 사용한다면 기기의 성능 저하가 발생합니다.
- 안드로이드 API 레벨 26(안드로이드 O)부터는 포그라운드 서비스를 통해 사용자에게 알리고 다른 서비스보다 높은 우선순위를 가지도록 지정합니다.
- 안드로이드 API 레벨 26 이상은 startService() 함수 대신 startForegroundService() 함수 사용합니다.
- startForegroundService() : 서비스 생성 이후 5초 이내에 startForeground() 함수를 통해 알림을 보여줘야 합니다. → startForeground(id, notification) → id: 식별자, notification: 사용자에게 보여질 알림
※ 본 게시글은 'Joyce의 안드로이드 앱 프로그래밍 - 홍정아' 책의 내용과
Android Developers의 공식문서 내용을 참고하여 작성하였습니다.
전체 코드가 궁금하다면 아래 링크를 참고하시길 바랍니다.
728x90
반응형
'안드로이드(Android)' 카테고리의 다른 글
뮤직 플레이어(MusicPlayer)_4 [Android_Kotlin] (0) | 2023.02.21 |
---|---|
뮤직 플레이어(MusicPlayer)_3 [Android_Kotlin] (0) | 2023.02.17 |
뮤직 플레이어(MusicPlayer)_1 [Android_Kotlin] (0) | 2023.02.15 |
스톱워치(StopWatch)_3 / [Android-Kotlin] (0) | 2023.02.13 |
스톱워치(StopWatch)_2 / [Android-Kotlin] (0) | 2023.02.10 |