안드로이드 Service는 백그라운드에서 실행되는 애플리케이션 구성 요소입니다. Service는 화면에 보이지 않지만, 애플리케이션의 생명주기와 독립적으로 실행될 수 있습니다.
안드로이드 Service는 주로 백그라운드에서 오래 실행되어야 하는 작업에 사용됩니다. 예를 들어, 네트워크 작업이나 음악 재생, 데이터베이스 액세스 등이 있습니다. Service는 사용자와 상호작용하지 않고, 화면에 보이지 않기 때문에, 다른 애플리케이션의 실행에 영향을 미치지 않으면서 백그라운드에서 작업을 수행할 수 있습니다.
Service는 onStartCommand() 메서드를 사용하여 시작되며, 이 메서드는 Intent 객체를 통해 Service에 전달됩니다. Service는 작업을 수행한 후 결과를 Activity에 반환하거나, BroadcastReceiver를 사용하여 알림을 전송할 수 있습니다.
Service는 다른 구성 요소와 마찬가지로 AndroidManifest.xml 파일에 등록되어야 합니다. 또한, Service는 백그라운드에서 실행되기 때문에 사용자의 배터리 수명에 영향을 미칠 수 있으므로, 적절한 배터리 사용을 위해 관리되어야 합니다.
onCreate
- onCreate() 메서드는 Service가 생성될 때 한 번 호출되며, 초기화 작업을 수행합니다.
onStartCommand
- Service를 다른 컴포넌트가 호출 했을 시 수행 되고, 이 메서드를 통해 서비스가 백그라운드에서 동작합니다.
- 3가지의 리턴 값이 있습니다.
- START_NOT_STICKY
이전에 실행한 Service가 종료되어도 다시 실행하지 않고, 메모리에서 제거됩니다.- START_STICKY
Service가 비정상적으로 종료되었을 때, 시스템이 자동으로 재시작하여 실행합니다.- START_REDELIVER_INTENT
Service가 실행 중이었을 때, 비정상적으로 종료되었을 경우, 시스템이 자동으로 재시작하고, 마지막으로 전달받은 인텐트를 다시 전달합니다.
onDestroy
1. 다른 컴포넌트에서 startService()로 호출할 경우 onStartCommand가 실행
2. stopService나 stopSelf()가 호출되면 서비스가 동작을 멈추고 시스템이 onDestroy하는 사이클
<application
... >
<service
android:name=".MyService"
android:enabled="true"
android:exported="false" />
...
</application>
위 예시는 MyService라는 이름의 Service를 manifest에 등록한 것입니다.
service는 application 태그 안에 추가 합니다
android:name: Service 클래스의 패키지 이름과 클래스 이름을 지정합니다.
android:enabled: Service를 사용할 수 있도록 설정합니다. (기본값은 true입니다.)
android:exported: 다른 앱에서 Service를 사용할 수 있는지 여부를 설정합니다. (기본값은 false입니다.)
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.study.music.myservice">
<application
... >
<service
android:name=".MyService"
android:enabled="true"
android:exported="false" />
...
</application>
</manifest>
service 태그를 다음과 같이 추가해 줍니다.
서비스를 사용할 수 있도록 enabled를 true로 지정해 주었습니다. 그리고 다른 앱에서 사용할 수 없도록 exported를 false로 지정해 주었습니다.
class MainActivity : AppCompatActivity() {
private lateinit var btnStart: Button
private lateinit var btnStop: Button
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
title = "서비스 테스트 예제"
intent = Intent(this, MyMusicService::class.java)
btnStart = findViewById(R.id.start_music_btn)
btnStop = findViewById(R.id.stop_music_btn)
btnStart.setOnClickListener {
startService(intent)
Log.d("test Service", "onCreate: startService()")
}
btnStop.setOnClickListener {
stopService(intent)
Log.d("test Service", "onCreate: StopService()")
}
}
}
시작 버튼과 멈춤 버튼 두개를 생성했습니다.
시작 버튼을 누르면 서비스가 시작되며, 멈춤 버튼을 누르면 서비스가 중지 됩니다.
class MyMusicService : Service() {
private lateinit var mp: MediaPlayer
override fun onBind(p0: Intent?): IBinder? {
return null
}
override fun onCreate() {
Log.d("test Service", "onCreate: ")
super.onCreate()
}
override fun onDestroy() {
Log.d("test Service", "onDestroy: ")
mp.stop() //음악 중지
super.onDestroy()
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
Log.d("test Service", "onStartCommand: ")
mp = MediaPlayer.create(this,R.raw.testmusic) // 음악 파일
mp.isLooping=true
mp.start()
return START_STICKY // 시스템에 의해 종료되어도 다시 생성
}
}
다음 결과로 Service의 생명주기를 확인하실 수 있습니다.