Archives
Recent Posts
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
Today
Total
관리 메뉴

안드로이드 개발자의 창고

[38일차 Android] Pending Intent 본문

Computer/Android

[38일차 Android] Pending Intent

Wise-99 2023. 6. 25. 20:13

 

 

 

출처 : 안드로이드 앱스쿨 2기 윤재성 강사님 수업 PPT

 

📖 ​Pending Intent

  • Notification 메시지를 통해 애플리케이션의 Activity를 실행할 수 있으며 이 때 Pending Intent를 사용한다.
  • Pending Intent를 통해 실행되는 Activity로 데이터를 전달 할 수 있다.

Action

  • 알림 메시지에 Button과 같은 것을 배치하여 이를 눌렀을 때 지정된 Activity를 실행할 수 있다.
  • 안드로이드 4.0 까지는 메시지 당 하나의 Activity만 실행이 가능했지만 4.1 이후로 Action이 제공되어 하나의 메시지에서 여러 Activity를 선택적으로 실행할 수 있게 되었다.

 

예제 코드

class MainActivity : AppCompatActivity() {

    lateinit var activityMainBinding: ActivityMainBinding
    lateinit var notificationManager: NotificationManager


    val permissionList = arrayOf(
        Manifest.permission.POST_NOTIFICATIONS
    )

    val NOTIFICATION_CHANNEL1_ID = "Pending"
    val NOTIFICATION_CHANNEL1_NAME = "Pending Intent"

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        activityMainBinding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(activityMainBinding.root)

        // 권한 허용
        requestPermissions(permissionList,0)

        notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
        addNotificationChannel(NOTIFICATION_CHANNEL1_ID, NOTIFICATION_CHANNEL1_NAME)

        activityMainBinding.run {
            button.setOnClickListener {
                val builder = getNoficationBuilder(NOTIFICATION_CHANNEL1_ID)
                builder.setContentTitle("Notification 1")
                builder.setContentText("알림 메시지1 입니다")
                builder.setSmallIcon(android.R.drawable.ic_menu_search)

                // 메시지를 터치하면 자동으로 메시지를 제거한다.
                builder.setAutoCancel(true)

                // 메시지를 터치하면 Activity가 실행되로록 한다.
                val newIntent = Intent(this@MainActivity, Notification1Activity::class.java)

                newIntent.putExtra("data1", 100)
                newIntent.putExtra("data2", "안녕하세요")

                val pendingIntent1 = PendingIntent.getActivity(this@MainActivity, 10,
                                        newIntent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)
                builder.setContentIntent(pendingIntent1)

                // Action 설정
                val newIntent2 = Intent(this@MainActivity, Notification2Activity::class.java)
                newIntent2.putExtra("data3", 200)
                newIntent2.putExtra("data4", "반갑습니다")

                val pendingIntent2 = PendingIntent.getActivity(this@MainActivity, 100,
                                        newIntent2,PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE)

                // Action을 생성한다.
                // 첫 번째 : 아이콘 설정
                // 두 번째 : 표시할 문자열
                // 세 번째 : PendingIntent
                val builder2 = NotificationCompat.Action.Builder(
                    android.R.drawable.ic_dialog_alert, "Action", pendingIntent2)
                val action2 = builder2.build()
                builder.addAction(action2)

                val notification = builder.build()
                notificationManager.notify(10, notification)
            }
        }
    }

    // Notification Channel을 등록하는 메서드
    // 첫 번째 : 코드에서 채널을 관리하기 위한 이름
    // 두 번째 : 사용자에게 노출 시킬 이름
    fun addNotificationChannel(id:String, name:String){
        // 안드로이드 8.0 이상일 때만 동작하게 한다.
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            // 알림 메시지를 관리하는 객체를 추출한다.
            val notificationManager = getSystemService(NOTIFICATION_SERVICE) as NotificationManager
            // id를 통해 NotificationChannel 객체를 추출한다.
            // 채널이 등록된 적이 없다면 null을 반환한다.
            val channel = notificationManager.getNotificationChannel(id)
            // 채널이 등록된 적이 없다면...
            if(channel == null){
                // 채널 객체를 생성한다.
                val newChannel = NotificationChannel(id, name, NotificationManager.IMPORTANCE_HIGH)
                // 단말기에 LED 램프가 있다면 램프를 사용하도록 설정한다.
                newChannel.enableLights(true)
                // LED 램프의 색상을 설정한다.
                newChannel.lightColor = Color.RED
                // 진동을 사용할 것인가?
                newChannel.enableVibration(true)
                // 채널을 등록한다.
                notificationManager.createNotificationChannel(newChannel)
            }
        }
    }

    // Notification 메시지 관리 객체를 생성하는 메서드
    // Notification 채널 id를 받는다.
    fun getNoficationBuilder(id:String) : NotificationCompat.Builder{
        // 안드로이드 8.0 이상이라면
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            val builder = NotificationCompat.Builder(this, id)
            return builder
        } else {
            val builder = NotificationCompat.Builder(this)
            return builder
        }
    }
}

코드 리뷰

  • val newIntent = Intent(this@MainActivity, Notification1Activity::class.java)
    • 메세지를 터치했을 때 실행되는 Intent
    • 해당 Intent에는 data1, data2를 넣어 Notification1Activity로 전달한다.

 

  • val newIntent2 = Intent(this@MainActivity, Notification2Activity::class.java)
    • 메세지의 Action이라는 버튼을 클릭했을 때 실행되는 Intent
    • 해당 Intent에는 data3, data4를 넣어 Notification2Activity에 저장한다.

 

  • val builder2 = NotificationCompat.Action.Builder()
    • Action 버튼을 생성한다.
    • 아이콘, 제목, PendingIntent 순서로 넣어 생성한다.

 

 

 

결과

 

'Computer > Android' 카테고리의 다른 글

[39일차 Android] Thread, runOnUiThraad  (0) 2023.06.26
[38일차 Android] 다양한 Notification  (0) 2023.06.25
[38일차 Android] Notification  (0) 2023.06.25
[37일차 Android] Dialog  (1) 2023.06.23
[37일차 Android] SnackBar  (0) 2023.06.23