Files
ShiftRing/app/src/main/java/com/example/shiftalarm/AlarmForegroundService.kt

84 lines
3.4 KiB
Kotlin

package com.example.shiftalarm
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.app.Service
import android.content.Context
import android.content.Intent
import android.os.Build
import android.os.IBinder
import androidx.core.app.NotificationCompat
class AlarmForegroundService : Service() {
private val CHANNEL_ID = "SHIFT_ALARM_CHANNEL_V5"
private val NOTIFICATION_ID = 1
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val shiftType = intent?.getStringExtra("EXTRA_SHIFT") ?: "근무"
val soundUri = intent?.getStringExtra("EXTRA_SOUND")
val snoozeMin = intent?.getIntExtra("EXTRA_SNOOZE", 5) ?: 5
val snoozeRepeat = intent?.getIntExtra("EXTRA_SNOOZE_REPEAT", 3) ?: 3
// 1. 알림 채널 생성
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel = NotificationChannel(
CHANNEL_ID,
"교대링 알람",
NotificationManager.IMPORTANCE_HIGH
).apply {
description = "알람이 울리는 동안 표시되는 알림입니다."
setSound(null, null) // 소리는 Activity에서 재생
enableVibration(false) // 진동은 Activity에서 재생
}
val manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.createNotificationChannel(channel)
}
// 2. 전체화면 실행을 위한 PendingIntent
val fullScreenIntent = Intent(this, AlarmActivity::class.java).apply {
putExtra("EXTRA_SHIFT", shiftType)
putExtra("EXTRA_SOUND", soundUri)
putExtra("EXTRA_SNOOZE", snoozeMin)
putExtra("EXTRA_SNOOZE_REPEAT", snoozeRepeat)
addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_SINGLE_TOP)
}
val fullScreenPendingIntent = PendingIntent.getActivity(
this,
100,
fullScreenIntent,
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
// 3. 일원화된 단일 알림 생성
val contentText = if (shiftType == "SNOOZE") "다시 울림 알람입니다." else "오늘의 근무는 [$shiftType] 입니다."
val notification: Notification = NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("교대링 알람 작동 중")
.setContentText(contentText)
.setSmallIcon(R.drawable.ic_alarm_blue)
.setPriority(NotificationCompat.PRIORITY_MAX)
.setCategory(NotificationCompat.CATEGORY_ALARM)
.setFullScreenIntent(fullScreenPendingIntent, true)
.setContentIntent(fullScreenPendingIntent)
.setOngoing(true)
.setAutoCancel(false)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.build()
// 4. Foreground 시작
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Android 14+
startForeground(NOTIFICATION_ID, notification, android.content.pm.ServiceInfo.FOREGROUND_SERVICE_TYPE_SPECIAL_USE)
} else {
startForeground(NOTIFICATION_ID, notification)
}
return START_NOT_STICKY
}
override fun onBind(intent: Intent?): IBinder? = null
}