Merged
Conversation
- `startService()` 호출 시 `onCreate()`와 `onStartCommand()`가 순차적으로 호출되는 것을 확인한다. - 서비스 내부에서 `stopSelf()`를 호출하고 `destroy()`를 통해 서비스를 종료하면 `onDestroy()`가 호출되는 것을 확인한다. - 테스트를 위해 `TestLifecycleService` 클래스를 추가하고, 각 생명주기 콜백에서 로그를 기록하도록 구현한다.
실제 음악 재생은 하지 않고, progress 만 이동하도록
- `PlaybackBoundServiceActivity`를 추가하여 바인드 서비스와 상호작용하는 UI 구현 - 서비스 상태 관찰 로직 추가 - 서비스 바인딩 및 언바인딩 로직 구현 - `PlaybackControlUI` Composable 함수 추가
- `playbackService`가 null일 경우 NPE 발생 가능성 제거 - 서비스 상태 관찰 로직을 단순화 - `progress` 상태를 `mutableFloatStateOf`로 변경하고, `derivedStateOf`에서 `floatValue` 사용 - 불필요한 로그 삭제
- `PlaybackControlUI` 컴포저블 함수를 `PlaybackBoundServiceActivity`에서 별도 파일로 분리
- AndroidManifest.xml에 `POST_NOTIFICATIONS`, `FOREGROUND_SERVICE`, `FOREGROUND_SERVICE_MEDIA_PLAYBACK 권한을 추가 - `PlaybackBoundService2` 서비스를 Manifest에 등록 - `PlaybackBoundService2` 음악 재생, 일시 정지 기능
- `PlaybackForegroundServiceActivity`:
- `PlaybackBoundService2`에 바인딩하여 재생 상태 및 진행률을 관찰하고 UI에 표시
- 서비스의 `play()`, `pause()` 메서드를 호출하여 재생 제어
- `onStart()`에서 서비스 시작 및 바인딩, `onStop()`에서 바인딩 해제
- 알림 권한 요청 로직 추가 (Android T 이상)
- 아티스트, 다음, 일시정지 아이콘 벡터 드로어블 리소스를 추가
- `androidx.media3:media3-session` 및 `androidx.media:media` 라이브러리 의존성을 추가 - `MusicPlayerService` 클래스를 생성하여 음악 재생 서비스 구현 - `MediaSessionCompat`을 사용하여 미디어 세션을 관리하고, 알림을 통해 미디어 컨트롤 제공 - `NotificationCompat.MediaStyle`을 사용하여 미디어 스타일의 알림을 생성 - 서비스 내에서 `MediaPlayer`를 사용하여 음악을 재생하고, 현재 재생 상태, 곡 정보, 재생 시간 등을 `MutableStateFlow`를 통해 관리 - `Binder`를 통해 액티비티에서 서비스에 접근하여 음악 목록 설정, 현재 재생 정보 가져오기 등의 기능을 수행 - `PendingIntent`를 사용하여 알림의 액션 버튼에 대한 처리 구현 - 코루틴을 사용하여 주기적으로 현재 재생 시간을 업데이트
- 서비스와 바인딩하여 음악 재생 기능을 UI와 연동한다. - `ServiceConnection`로 서비스 연결 및 해제 시 로직을 처리한다. - 서비스로부터 음악 재생 상태, 현재 트랙 정보, 진행 상태 등을 `StateFlow`로 받아 UI에 반영한다. - UI 요소(재생/일시정지, 이전 곡, 다음 곡 버튼, 진행 바 등)를 Compose를 사용하여 구현한다. - TopAppBar에 서비스 시작/중지 및 바인딩/언바인딩을 위한 아이콘 버튼을 추가한다.
- `MusicPlayerScreen` 컴포저블을 새로 생성하여 `MusicPlayerActivity`의 UI 로직을 분리한다. - 알림 채널 생성 로직을 이동한다: `BaseApplication` -> `MusicPlayerActivity` - `MusicPlayerService`의 알림 빌더에서 중복된 `addAction` 호출을 제거한다. - `AndroidManifest.xml`에서 `BaseApplication` 지정을 제거한다.
- `play()` 메서드를 private으로 변경하고, `prev()` 및 `next()` 메서드에서 이를 호출한다. - 불필요한 MediaPlayer 의 반복 초기화를 제거한다.
- `MusicPlayerActivity` -> `ForegroundBoundMusicActivity` - `MusicPlayerService` -> `ForegroundBoundMusicService` - `PlaybackBoundServiceActivity` -> `SimpleBoundServiceActivity` - `PlaybackBoundService` -> `SimpleBoundPlaybackService` `AndroidManifest.xml`에 변경된 클래스 이름들을 반영한다
- 서비스 유형(Bound, Unbound - Foreground, Background) 설명 추가 - 각 서비스 유형별 예시 및 사용 사례 정리 - Bound Service 예제로 로컬 바인더를 이용한 음악 재생 서비스 구현 ([SimpleBoundMusicService.kt](SimpleBoundMusicService.kt), [SimpleBoundMusicActivity.kt](SimpleBoundMusicActivity.kt)) - 포그라운드 + 바운드 서비스 예제 ([ForegroundBoundMusicActivity.kt](ForegroundBoundMusicActivity.kt), [ForegroundBoundService.kt](ForegroundBoundService.kt))
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
작업 요약
안드로이드 서비스 구조에 대한 학습을 바탕으로, 다음과 같은 실습 및 구조 개선을 진행했습니다:
Bound Service 구현
SimpleBoundPlaybackService,SimpleBoundServiceActivity를 통해 기본적인 바운드 서비스 예제 구현StateFlow기반으로 재생 상태 및 progress 전달PlaybackControlUI로 UI 컴포저블 분리Foreground + Bound Service 구현
ForegroundBoundMusicService,ForegroundBoundMusicActivity파일 생성MediaPlayer,MediaSessionCompat,Notification활용한 음악 재생 기능 구현startForeground()로 실행되며, 바인딩을 통해 UI와 상호작용Activity에서 조건부 생성 (Android 13 대응)리팩토링 및 정리
PlaybackBoundService2등 불필요한 실험 파일 제거MusicPlayerService→ForegroundBoundMusicService등)MusicPlayerActivityUI 분리 및 상태 흐름 구조화play()관련 중복 로직 함수 분리service.md에 전체 실습 흐름 정리 문서 작성 및 파일 구조 설명 추가리소스 추가
학습 테스트
TestLifecycleServiceTest를 통해 서비스 생명주기 관련 테스트 추가주요 파일 구조 변화
추후에 더 공부할 것들: