Initial commit - v1.1.9
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user