반응형
안녕하세요.
오늘은 안드로이드의 알람생성을 위한 Notification을 사용할 때 주의할 점에 대해서 알아보겠습니다.
분명히 며칠전까지만해도 정상적으로 작동하던 알람이 언젠가부터 동작하지 않는 문제가 있어서 코드를 면밀히 살펴본 결과 Noficiation Channel이 notification과 연결되지 않고 있었습니다.(무언가 단축키도 한줄을 날려버린것 같습니다...ㅜㅜ)
안드로이드 Oreo버전 이후로 Notificaion을 발생시키기 위해서는 Notification Channel이 필요하다는 것을 다들 알고 계실거라고 생각합니다...ㅎㅎ 모르신다면 아래 URL을 참고해주세요 !
https://developer.android.com/training/notify-user/channels?hl=ko
채널을 만들어주는것도 중요하지만 내가 발생시킬 Nofication이 생성한 채널과 연결되어있는지 다시한번 확인하는 절차도 꼭 필요한 절차입니다.
다음은 제가 발생시키고자 하는 Notification의 소스코드입니다.
package your package in here
import android.app.Notification
import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.PendingIntent
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.os.Build
import android.util.Log
import androidx.core.app.NotificationCompat
import com.myhome.smoketimer.R
import com.myhome.smoketimer.service.AlarmIntentService
import com.myhome.smoketimer.view.MainActivity
class AlarmBroadcastReceiver : BroadcastReceiver() {
companion object{
const val TAG = "SmokeTimer Alarm"
const val NOTIFICATION_ID = 1007
const val PRIMARY_CHANNEL_ID = "primary_notification_channel"
}
lateinit var notificationManager:NotificationManager
override fun onReceive(context: Context, intent: Intent) {
Log.d(TAG, "Received intent : $intent")
notificationManager = context.getSystemService(
Context.NOTIFICATION_SERVICE) as NotificationManager
createNotificationChannel(context)
deliverNotification(context)
}
private fun deliverNotification(context: Context) {
val contentIntent = Intent(context, MainActivity::class.java)
val contentPendingIntent = PendingIntent.getActivity(
context,
NOTIFICATION_ID,
contentIntent,
PendingIntent.FLAG_UPDATE_CURRENT
)
val builder =
NotificationCompat.Builder(context, context.getString(R.string.app_name))
.setSmallIcon(R.drawable.logo_cut)
.setContentTitle(context.getString(R.string.text_arrive_period_title))
.setContentText(context.getString(R.string.text_arrive_period_description))
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setDefaults(Notification.DEFAULT_SOUND)
.setChannelId(PRIMARY_CHANNEL_ID)
// 이 부분을 확인해주세요. 아래 ceateNotificationChannel에서 생성한 채널의 PRIMARY_CHANNEL_ID와 일치하여야 합니다.
.setContentIntent(contentPendingIntent)
// .setAutoCancel(true)
notificationManager.notify(NOTIFICATION_ID, builder.build())
}
fun createNotificationChannel(context: Context) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val notificationChannel = NotificationChannel(
PRIMARY_CHANNEL_ID,
"Stand up notification",
NotificationManager.IMPORTANCE_HIGH
)
notificationChannel.enableLights(true)
notificationChannel.lightColor = Color.RED
notificationChannel.enableVibration(true)
notificationChannel.description = context.getString(R.string.text_arrive_period_description)
notificationManager.createNotificationChannel(
notificationChannel)
}
else{
Log.d("VERSION ISSUE==", "executed")
}
}
}
<AlarmBroadcastReceiver.kt>
그리고 다음과 같이 알람을 발생시켜 주시면 됩니다.
fun alarmBroadcastReceiver(time:Long){
val alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager
val intent = Intent(applicationContext, AlarmBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(this,
REQUEST_CODE_ALARM,
intent,
PendingIntent.FLAG_UPDATE_CURRENT
)
alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
SystemClock.elapsedRealtime() + 100000,
pendingIntent)
// alarmManager.set(AlarmManager.ELAPSED_REALTIME_WAKEUP,
// time,
// pendingIntent)
}
<발생하고자 하는 context(activity 등)>
자 ! 모두들 알람이 잘 작동되셨나요 ? 그러면 오늘도 좋은 하루 되시고 저는 이만 물러가도록 하겠습니다.
감사합니다. 안녕~~!
'IT 프로그래밍-Android' 카테고리의 다른 글
Hilt 적용기 1 (0) | 2022.04.02 |
---|---|
[안드로이드] receiver 사용 시 주의할 점 (0) | 2022.02.07 |
[안드로이드] AlarmManager 사용 시 주의할 점 (0) | 2022.02.06 |
[Retrofit] java.lang.IllegalStateException: Expected Android API level 21+ but was 29 에러 해결 (0) | 2022.01.18 |
[안드로이드] 달력만들기 (0) | 2021.12.05 |