일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- transformation.map
- swift #swift keychain #keychain 사용법
- pod install
- Swift Package Manager
- ViewBuilder
- Tuist
- oberve url
- List
- 스크롤 탭
- detect url
- 기존 앱
- url 추적
- development language
- UIPresentationController
- scrolling tab
- notifychanged
- SwiftUI
- 개발자 면접
- Side Menu
- convert base64
- DevelopmentRegion
- Android
- DataBinding
- swift
- base64 변환
- ios
- GeometryReader
- UIViewControllerTransitioningDelegate
- 상단 탭바
- url 관찰
- Today
- Total
버그 잡이
android 알람 앱 "어떤 service를 사용해야할까?" # 음악 재생 본문
나는 지금 알람앱을 만들고 있다.
알람이 시작되면 음악을 재생시켜야 하는데 '어떤 Service를 사용하는 것이 좋을까?'
결론부터 이야기하자면 아래와 같다.
startService() & foregroundService
내가 만들 서비스는 음악이 재생되는 서비스이고 세부 요구사항을 살펴보자
요구사항#1 : 음악 재생상태와 버튼 상태를 동기화시킬 필요가 없다. -> UI에 영향을 줄 필요가 없다.
요구사항#2 : 1분 이상 지속되어야 한다.
서비스의 종류
서비스는 위 그림처럼 크게 두가지 방법으로 나눠서 사용한다.
*startService()
- 백그라운드에서 실행되고, 한번 시작된 서비스는 stopService를 호출할때까지 계속 실행된다.
- 하지만 작업 결과를 호출자에게 반환하지 않기 때문에, 호출자와 상호작용하는 작업에는 적합하지 않는다.
- 가장 간단한 기본적인 구현 방법이다.
*bindService()
- startService()와는 다르게 작업 결과를 호출자에게 전달할 수 있고 호출자에게서도 특정 결과를 받을 수 있다. 즉, 서로 상호작용할 수 있는 것이다.
- 바인딩을 하려면 ServiceConnection을 구현해야한다.
- ex) 음악 플레이어에서 '재생 버튼'과 '일시정지 버튼'을 음악 상황에 따라 변경 및 유지.
-> 내가 만들 앱의 경우 음악 재생 상태에 따라 버튼의 상태를 바꿀 필요가 없고 단순히 음악 재생만 하면 되기 때문에 startService()를 이용한 방식이 적합하다.(요구사항 #3)
ForegroundService
startService()로 서비스를 시작하면 stopService()가 호출될때까지 무기한 실행되는 것으로 알고 있었다.
그런데 실제로 동작시켜보니 한 10초 있다가 서비스가 강제 종료된다.
찾아보니 Oreo 이후 버전에서는 서비스를 백그라운드에서 실행하는 것을 금지하기 때문에 포그라운드(Foreground)
에서 실행해야한다.(요구사항#2)
class AlarmService : Service() {
override fun onCreate() {
if (Build.VERSION.SDK_INT >= 26) {
val CHANNEL_ID = "my_channel_01"
val channel = NotificationChannel(
CHANNEL_ID,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT
)
(getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(
channel
)
val notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("")
.setContentText("").build()
startForeground(111, notification)
//원하는 작업
}
else{
//원하는 작업
}
}
}
*startForeground를 하기 위해서는 notification을 만들어줘야한다.
'안드로이드' 카테고리의 다른 글
[android] edittext 적용시 확인해야할 디테일. #editTextInputFilter 코틀린에 적용하기 (0) | 2020.05.01 |
---|---|
android 알람 앱 시간 설정 #Calendar #LocalDateTime #joda-time (0) | 2020.04.30 |
[Kotlin] 안드로이드 recyclerView 클릭 리스너 달기 #onItemclickListener (2) | 2020.04.28 |
Kotlin AlarmManager로 알람 앱 만들기 (0) | 2020.04.24 |
Room에서 List 사용하기 #Kotlin #TypeConverter #Android (2) | 2020.04.23 |