IT 프로그래밍-Android

[안드로이드] Notification이 발생하지 않는 오류

godsangin 2022. 3. 6. 17:31
반응형

안녕하세요.

오늘은 안드로이드의 알람생성을 위한 Notification을 사용할 때 주의할 점에 대해서 알아보겠습니다.

 

분명히 며칠전까지만해도 정상적으로 작동하던 알람이 언젠가부터 동작하지 않는 문제가 있어서 코드를 면밀히 살펴본 결과 Noficiation Channel이 notification과 연결되지 않고 있었습니다.(무언가 단축키도 한줄을 날려버린것 같습니다...ㅜㅜ)

 

안드로이드 Oreo버전 이후로 Notificaion을 발생시키기 위해서는 Notification Channel이 필요하다는 것을 다들 알고 계실거라고 생각합니다...ㅎㅎ 모르신다면 아래 URL을 참고해주세요 !

https://developer.android.com/training/notify-user/channels?hl=ko 

 

알림 채널 만들기 및 관리  |  Android 개발자  |  Android Developers

알림 채널 만들기 및 관리 Android 8.0(API 수준 26)부터는 모든 알림을 채널에 할당해야 합니다. 채널마다 채널의 모든 알림에 적용되는 시각적/음향적 동작을 설정할 수 있습니다. 그런 다음 사용자

developer.android.com

 

채널을 만들어주는것도 중요하지만 내가 발생시킬 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 등)>

 

자 ! 모두들 알람이 잘 작동되셨나요 ? 그러면 오늘도 좋은 하루 되시고 저는 이만 물러가도록 하겠습니다.

 

감사합니다. 안녕~~!