본문 바로가기
Android

Notification의 사용방법

by 안솝우화 2021. 5. 6.
반응형

기본적인 Notification 사용방법


 

activity_main_80.xml

<?xml version="1.0" encoding="utf-8"?>
<layout
    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">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".SimpleNotificationExample80.MainActivity_80">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </androidx.constraintlayout.widget.ConstraintLayout>

</layout> 

 

MainActivity_80.kt

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.core.app.NotificationCompat
import androidx.databinding.DataBindingUtil
import com.what.notifications.R
import com.what.notifications.databinding.ActivityMain80Binding

class MainActivity_80 : AppCompatActivity() {
    //알림을 위한 채널 id 정의
    private val channelID = "com.what.notifications.SimpleNotificationExample80.channel1"
    //알림 관리자 인스턴스 정의(알림 채널과 알림 인스턴스를 만드는데 필요)
    private var notificationManager:NotificationManager? = null
    lateinit var binding:ActivityMain80Binding
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = DataBindingUtil.setContentView(this,R.layout.activity_main_80)

        //알림관리자 인스턴스를 가져옴
        notificationManager = getSystemService( Context.NOTIFICATION_SERVICE) as NotificationManager
        //알림채널에는 ID, 채널 이름 및 채널 설명이 있다


        createNotificationChannel(channelID,"DemoChannel","this is a demo")


        binding.button.setOnClickListener {
            displayNotification()
        }
    }

    private fun displayNotification(){
        val notificationId = 45
        val notification = NotificationCompat.Builder(this@MainActivity_80, channelID)
            .setContentTitle("Demo Title")
            .setContentText("This is a semo notification")
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setAutoCancel(true)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .build()
        notificationManager?.notify(notificationId, notification)
    }

    private fun createNotificationChannel(id: String, name: String, channeIDescription: String){
        //SDK버전 확인(낮으면 기능작동X, oreo이상부터 작동)
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
            val importance = NotificationManager.IMPORTANCE_HIGH
            val channel = NotificationChannel(id, name, importance).apply {
                description = channeIDescription
            }
            notificationManager?.createNotificationChannel(channel)

        }
    }
} 

실행해보면 버튼을 눌렀을시 기본적인 알림이 표시됩니다

SDK버전은 반드시 oreo이상으로 올려주셔야 합니다

 

 

 

 


알림을 클릭시 원하는 xml로 이동 설정


Activity 하나를 만들어 줍니다(저는 MainActivity_82를 만들었습니다)

MainActivity_80.kt에 추가합니다

        //메세지 아이콘을 눌렀을때 이동
        val tapResultIntent =  Intent(this, MainActivity_82::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
        val pendingIntent: PendingIntent = PendingIntent.getActivity(
            this,
            0,
            tapResultIntent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )

NotificationCmpat.Builder에 추가합니다

            .setContentIntent(pendingIntent)

(NotificationCmpat.Builder 전체 코드)

     val notification = NotificationCompat.Builder(this@MainActivity_80, channelID)
            .setContentTitle("Demo Title")
            .setContentText("This is a semo notification")
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setAutoCancel(true)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)
            .build()

실행 해보기 전에 새로만든 xml에 구분 하기 위해 TextView한개를 추가해 줍니다

 

 

 

 


알림펍업에 버튼 추가


DetailsActivity와 SettingActivity라는 액티비티를 만들어 줍니다

그리고 xml에 각각 구분하기 위해 TextView로 Details와 Setting를 써줍니다

 

그 다음 MainActivity_80.kt에 추가해 줍니다

        //action button 1 ----------------------------------------------------------------
        val intent2Intent =  Intent(this, DetailsActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
        val pendingIntent2: PendingIntent = PendingIntent.getActivity(
            this,
            0,
            intent2Intent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )
        val action2 : NotificationCompat.Action =
            NotificationCompat.Action.Builder(0,"Details",pendingIntent2).build()

        //action button 2 ----------------------------------------------------------------
        val intent3Intent =  Intent(this, SettingsActivity::class.java).apply {
            flags = Intent.FLAG_ACTIVITY_CLEAR_TASK
        }
        val pendingIntent3: PendingIntent = PendingIntent.getActivity(
            this,
            0,
            intent3Intent,
            PendingIntent.FLAG_UPDATE_CURRENT
        )
        val action3 : NotificationCompat.Action =
            NotificationCompat.Action.Builder(0,"Settings",pendingIntent3).build()

 

 

NotificationCmpat.Builder에 추가합니다

.addAction(action2)
.addAction(action3)

(NotificationCmpat.Builder 전체 코드)

    val notification = NotificationCompat.Builder(this@MainActivity_80, channelID)
            .setContentTitle("Demo Title")
            .setContentText("This is a semo notification")
            .setSmallIcon(android.R.drawable.ic_dialog_info)
            .setAutoCancel(true)
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setContentIntent(pendingIntent)
            .addAction(action2)
            .addAction(action3)
            .build()

실행 시켜 보면 팝업에 버튼이 생기고 각각의 버튼을 누를때마다 다른 화면이 나오게 될겁니다

 

 

 


알림 팝업에 응답가능


메신저 앱을 보면 팝업창에서 답변을 보내는 등의 활동을 합니다.

그게 바로 알림 팝업에 응답을 할수있게 만들어 주는것 입니다

 

한번 구현해 보겠습니다

MainActivity_80.kt로 갑니다

앞에 KEY_REPLY를 선언해 줍니다

    private val KEY_REPLY = "key_reply"

onCreate()로 와서 추가해 줍니다

//reply action
        val remoteInput : RemoteInput = RemoteInput.Builder(KEY_REPLY).run {
            setLabel("Insert you name here")
            build()
        }

        val replyAction : NotificationCompat.Action = NotificationCompat.Action.Builder(
            0,
            "REPLY",
            pendingIntent
        ).addRemoteInput(remoteInput)
            .build()

그리고 NotificationCmpat.Builder에

.setContentIntent(pendingIntent)를 삭제하고 아래 항목을 추가합니다 

            .addAction(replyAction)

 

activity_main_82.xml로 와서 응답한 text를 보여줄 TextView를 만듭니다

  <TextView
        android:id="@+id/result_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        android:textSize="30sp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

MainActivity_82.kt로 와서 아래 코드를 추가해 줍니다

class MainActivity_82 : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main_82)
        receiveInput()
    }

    private fun receiveInput(){
        val KEY_REPLY = "key_reply"
        val intent = this.intent
        val remoteInput = RemoteInput.getResultsFromIntent(intent)
        if (remoteInput!=null){
            val inputString = remoteInput.getCharSequence(KEY_REPLY).toString()
            val result_text_view = findViewById<TextView>(R.id.result_text_view)
            result_text_view.text = inputString
        }
    }

이제 실행을 해보면 답변하는 버튼을 누르면 텍스트를 입력할수 있는 창이 나오게 됩니다

 

 

 

 


알림 업데이트


알림에 응답을 했을때 응답의 대한 답장을 할수 있습니다

예를 들어 방금 전의 예제에서 답변을 보냈을 경우 팝업이 "답변을 성공적으로 보냈습니다" 이런식으로 바뀝니다

한번 구현해 봅시다

 

MainActivity_82.kt에 private fun receiveInput안에 추가해 줍니다

     val channelID = "com.what.notifications.SimpleNotificationExample80.channel1"
            val notificationId = 45

            val repliedNotification = NotificationCompat.Builder(this, channelID)
                .setSmallIcon(android.R.drawable.ic_dialog_info)
                .setContentText("Your reply received")
                .build()

            //알림관리자 인스턴스 가져옴, 시스템 서비스 사용
            val notificationManager:NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            //마지막으로 notificationManager인스턴스를 사용하여 알림
            notificationManager.notify(notificationId, repliedNotification)

channelID와 notificationId은 앞에서 선언했던(MainActivity_80.kt) 반드시 그대로 다시 선언해 줘야합니다.

실행 해보시면 성공적으로 답변을 했을시 응답 팝업이 뜨는것을 확인할수 있습니다

반응형

'Android' 카테고리의 다른 글

WorkManager 란?  (0) 2021.05.18
Fragment안에 있는 ViewPager2  (0) 2021.05.11
Okhttp란?  (0) 2021.04.15
Retrofit을 사용하여 데이터를 가져와 화면에 나타내기  (0) 2021.04.14
Json 데이터 클래스 생성  (0) 2021.04.10