84 lines
3.4 KiB
Kotlin
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
|
|
}
|