ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kotlin] 뮤직 플레이어: MediaPlayer API, 서비스와 생명 주기
    공부 기록/Kotlin 2022. 3. 26. 17:38
    728x90

    Joyce의 안드로이드 앱 프로그래밍 with 코틀린

    08 project 뮤직 플레이어: MediaPlayer API, 서비스

    [Kotlin] 스톱워치: thread (runOnUiThread), Deprecated, SDK 버전

     


     

    서비스: 백그라운드에서 꺼지지 않고 작업을 수행하는 안드로이드 4대 구성 요소 중 하나. 사용자가 서비스를 이용하면 시스템에게 "이건 서비스라는 건데 사용자와 인터렉션을 하지는 않지만 오랫동안 실행되어야 해. 누군가 멈추라고 하기 전까지 멈추지 말아줘."라고 알려줌.
    독립된 구성요소로 독립된 생명 주기를 가짐. 액티비티가 소멸되더라도 서비스는 독립된 상태로 실행되고 있어 다시 액티비티를 생성하여 해당 서비스와 소통할 수 있음. (예: 음악 앱. 음악 재생되고 있을 때 앱을 꺼도 음악은 계속 재생됨. -> 서비스 덕분)

    서비스 유형

    • 시작된 서비스: startSevice() 함수를 액티비티나 다른 서비스에서 실행하여 서비스를 시작할 수 있음. -> 서비스 내의 콜백 메서드인 onCreate(), onStartCommand()가 차례로 호출되어 시작된 상태가 됨. 시작되면 stopSelf()로 알아서 중지하거나, 다른 구성요소가 stopService()를 호출하여 서비스를 종료 가능 -> onDestory()가 호출되어 서비스가 완전히 종료되고, 이렇게 종료시키기 전까지 계속 실행중인 상태로 존재. 여러 구성요소에서 startService()를 호출해도 서비스 객체는 하나만 생성되며 onCreate() 역시 서비스 만들 때 처음에만 호출 됨. (서비스에서 딱 한번만 수행되어야 하는 작업은 onCreate()를 이용하기)
    • 바인드된 서비스: 다른 구성요소와 연결 가능. 액티비티-서비스 바인딩 되어있으면 액태비티는 서비스에 정의된 함수를 사용할 수 있고 서비스에 요청을 보내 응답을 받을 수 있음. 다른 앱의 구성요소가 서비스에 접근할 수 있도록 할수도 있음. 마치 서버(서비스)클라이언트(다른 구성요소) 관계를 이룬다고 할 수 있음 (예: 음악 앱에서 서비스를 실행한 후 음악 재생하면 앱을 꺼도 음악은 계속 재생됨. 다시 앱을 실행하면 액티비티가 서비스와 바인드되고 재생을 컨트롤 할 수 있다.)
    • 시작되고 바인드된 서비스: 대부분은 위 두개를 함께 사용. 백그라운드에서 계속 남아있는 동시에 다른 구성요소와 연결되어 소통이 간능하게끔 하는 경우. startService()와 bindService() 함수 둘다 실행. startService()로 시작된 상태가 된 서비스는 특별한 요청이 없는 한 바인드된 구성요소와 모든 연결이 끊겨도 계속 살아있음. 
     
    이번 프로젝트에선 "시작되고 바인드된 서비스"를 구현하기로. 

    Design 모드에서 버튼 text를 지정하면 노란색 경고 표시와 함께 '문자열을 직접 적지 말고 string 리소스를 사용하라'는 경고가 나타남.
    -> res > value > string.xml에 문자열 직접 입력 -> activity_main.xml에 string id 값 입력

     


    상태 표시줄에 알림 아이콘으로 쓸 이미지 추가:
    res > drawable > New > Vector Asset

     새로운 서비스 클래스 생성:
    app > java > com.example.{PROJECT_NAME} 폴더에서 우클릭 > New > Kotlin File/Class > Class 선택된 상태에서 이름 지정 

    새로 생성한 MusicPlayerService.kt에 서비스의 생명 주기에 따른 틀 작성

     

    package com.example.simplemusicplayer
    
    import android.app.Service
    import android.content.Intent
    import android.os.IBinder
    
    class MusicPlayerService : Service() {
    
        override fun onCreate() { // 서비스가 생성될 때 딱 한번만 실행. startService()나 bindService() 중 무엇을 이용하여 서비스를 생성하든 처음 한번만 실행.
            // 여기서 상태 표시줄에 앱이 실행되고 있다는 알림을 생성하는 startForegroundService() 실행.
            super.onCreate()
            startForegroundService() // 포그라운드 시작
        }
    
        // 바인드
        override fun onBind(intent: Intent?): IBinder? { // 액티비티와 같은 구성요소에서 bindService()를 호출할 때 실행되는 함수. 서비스와 구성요소를 이어주는 IBinder 반환.
            // 바인더 필요없는 서비스는 null 반환하면 됨.
            TODO("Not yet implemented")
        }
    
        // 시작된 상태 & 백그라운드.
        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { //  startService()나 startForegroundService() 호출 시 실행되는 함수.
            // 이 함수가 실행되면 서비스는 시작된 상태가 되고 백그라운드에서 죽 존재. 
            return super.onStartCommand(intent, flags, startId)
        }
    
        // 서비스 종료. 서비스 생명주기의 마지막. onCreate()에서 상태표시줄에 보여주었더너 알림을 해제.
        override fun onDestroy() {
            super.onDestroy()
        }
    }

    댓글

Designed by Tistory.