본문 바로가기

[Android/Kotlin] 안드로이드 Notification(1)

꿈꾸는블로그왕 2021. 2. 5.

안녕하세요. 오늘은 알림 이벤트인 Notification을 구현해 보도록 하겠습니다.

 

안드로이드 Notification은 아래 그림과 같이 제목, 메시지 그리고 아이콘 등이 표시됩니다.

구현하는 방법은 NotificationComapt.Builder 객체를 사용하여 알림 콘텐츠와 채널을 설정해야 합니다.

 

setContentTitle() -> 제목

setContentText() -> 본문

setSmallIcon() -> 작은 아이콘

setPriority() -> 우선순위 설정

 

그리고 안드로이드 8.0 이상부터는 NotificationChannel 인스턴스를 createNotificationChannel()에 전달하여 등록해야합니다.

 

그리고 알림 메시지 클릭 이벤트 등을 처리하기 위해 PendingIntent 객체를 setContentIntent()에 전달합니다.

 

그럼 한번 구현해 보도록 하겠습니다.

 

완성된 모습은 아래와 같습니다.

 

STEP01. 레이아웃 구성하기

Title과 Message를 넣을 EditText를 두개 만들고, 버튼을 하나 만들었습니다.

[actvity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:gravity="center"
        android:padding="16dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <EditText
            android:id="@+id/edt_title"
            android:hint="Title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <EditText
            android:id="@+id/edt_message"
            android:hint="Message"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <Button
            android:id="@+id/btn_notification"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Show Notification" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

 

STEP02. 채널 만들기

메인 액티비티 클래스 내에 createNotificationChannel() 함수를 하나 만들었습니다.

[MainActivity.kt]

@RequiresApi(Build.VERSION_CODES.O)
private fun createNotificationChannel(notificationManager: NotificationManager) {
    val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, IMPORTANCE_HIGH).apply {
        description = "Channel Description"
        enableLights(true)
        lightColor = Color.GREEN
    }
    notificationManager.createNotificationChannel(channel)
}

[Constants.kt]

object Constants {
    const val CHANNEL_ID = "channel_id"
    const val CHANNEL_NAME = "channel_name"
}

 

STEP03. Notification 만들기

showNotification 버튼을 클릭하면 시행할 메소드입니다.

[MainActivity.kt]

private fun sendNotification() {
    val title = binding.edtTitle.text.toString()
    val message = binding.edtMessage.text.toString()

    val intent = Intent(this, MainActivity::class.java)
    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
            as NotificationManager
    val notificationID = Random.nextInt()

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        createNotificationChannel(notificationManager)
    }

    val pendingIntent = getActivity(this, 0, intent, FLAG_ONE_SHOT)
    val notification = NotificationCompat.Builder(this, CHANNEL_ID)
        .setContentTitle(title)
        .setContentText(message)
        .setSmallIcon(R.drawable.ic_baseline_phone_android_24)
        .setAutoCancel(true)
        .setContentIntent(pendingIntent)
        .build()

    notificationManager.notify(notificationID, notification)
}

 

전체 코드는 아래를 참고하시기 바랍니다.

 

[MainActivity.kt]

class MainActivity : AppCompatActivity() {

    private var _binding: ActivityMainBinding? = null
    private val binding get() = _binding!!

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        _binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

        binding.btnNotification.setOnClickListener {
            sendNotification()
        }
    }

    private fun sendNotification() {
        val title = binding.edtTitle.text.toString()
        val message = binding.edtMessage.text.toString()

        val intent = Intent(this, MainActivity::class.java)
        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE)
                as NotificationManager
        val notificationID = Random.nextInt()

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            createNotificationChannel(notificationManager)
        }

        val pendingIntent = getActivity(this, 0, intent, FLAG_ONE_SHOT)
        val notification = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle(title)
            .setContentText(message)
            .setSmallIcon(R.drawable.ic_baseline_phone_android_24)
            .setAutoCancel(true)
            .setContentIntent(pendingIntent)
            .build()

        notificationManager.notify(notificationID, notification)
    }

    @RequiresApi(Build.VERSION_CODES.O)
    private fun createNotificationChannel(notificationManager: NotificationManager) {
        val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, IMPORTANCE_HIGH).apply {
            description = "Channel Description"
            enableLights(true)
            lightColor = Color.GREEN
        }
        notificationManager.createNotificationChannel(channel)
    }

    override fun onDestroy() {
        super.onDestroy()
        _binding = null
    }
}

 

댓글