Deperecated/Android_강의

안드로이드 - Pending Intent

누알라리 2020. 2. 14. 02:03
1. Pending Intent란?

- Notification 메세지를 통해 어플리케이션의 Activity(화면)를 실행할 수 있는데 이 때 사용하는것이 Pending Intent이다.

- Pending Intent를 통해 실행되는 Activity로 데이터를 전달할 수도 있다.

 

2. 구성방법

1. Notification 빌더 생성

 

2. Intent 생성

- *Intent: 안드로이드 OS에게 저 이거 실행시켜주세요 시키는 것.

- 이 부분에서 설정된 Activity로 이동할 수 있고, data도 보낼 수 있다.

 

3. pendingIntent에 메세지를 클릭한 후 이동할 Activity 설정

 

4. NotificationManager에 최종 연결

        button3.setOnClickListener { view ->

            // 1. 노티피케이션 빌더 생성
            var builder = getNotificationBuilder1("pending", "pendingIntent")
            builder.setContentTitle("notification 2")
            builder.setContentText("알림메세지 2 입니다")
            builder.setSmallIcon(R.drawable.images)
            builder.setAutoCancel(true)

            //2. Intent 생성
            // Intent란 안드로이드 OS에게 저 이거 실행시켜주세요 시키는 것
            var intent1 = Intent(this, TestActivity2::class.java)

            var pending1 = PendingIntent.getActivity(this, 0, intent1, 0)
            builder.setContentIntent(pending1)


            var notification = builder.build()
            
            var manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.notify(20, notification)
        }

 

3. 메세지 클릭했을 때 열리는 Activity에 Data 전달하기

1. 기본 구성은 위와 같고, Intent에 putExtra를 통해 다른 Activity에 넣어줄 데이터를 세팅해준다.

2. getActivity의 플래그를 꼭 PendingIntent.FLAG_UPDATE_CURRENT로 해준다.

3. 다른 Notification과 같은 Activity를 공유할 경우 PendingIntent.getActivity의 requestCode를 다르게 해줘야 한다.

        button4.setOnClickListener { view ->

            // 1. 노티피케이션 빌더 생성
            var builder = getNotificationBuilder1("pending", "pendingIntent")
            builder.setContentTitle("notification 3")
            builder.setContentText("알림메세지 3 입니다")
            builder.setSmallIcon(R.drawable.images)
            builder.setAutoCancel(true)

            //2. Intent 생성
            // Intent란 안드로이드 OS에게 저 이거 실행시켜주세요 시키는 것
            var intent1 = Intent(this, TestActivity1::class.java)


            // Notification 눌렀을 때 나오는 Activity에서 데이터를 뽑아쓰기 위해 putExtra.
            intent1.putExtra("data1", "문자열 데이터3")
            intent1.putExtra("data2", 300)

            // 플래그를 꼭 FLAG_UPDATE_CURRENT로 해줘야 데이터가 잘 전달된다.
            // requestCode
            var pending1 = PendingIntent.getActivity(this, 20, intent1, PendingIntent.FLAG_UPDATE_CURRENT)
            builder.setContentIntent(pending1)


            var notification = builder.build()
            var manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.notify(30, notification)
        }

4. 다른 Activity에서 get000Extra()로 데이터를 받아온다.

        var data1 = intent.getStringExtra("data1")
        var data2 = intent.getIntExtra("data2", 0)

        textView.text = "data1 = ${data1} \n"
        textView.append("data2 = ${data2}")

 

4. Action(액션)

- 메세지 당 액티비티를 여러개 지정할 수 있게 하는 기능.

- Notification 메세지 밑에 Action으로 표시되며, 그냥 Notification 누르면 그냥 연결된 Activity, 액션버튼을 누르면 액션에 설정한 Activity로 이동한다.

        button2.setOnClickListener { view ->

            // 1. 노티피케이션 빌더 생성
            var builder = getNotificationBuilder1("pending", "pendingIntent")
            builder.setContentTitle("notification 1")
            builder.setContentText("알림메세지 1 입니다")
            builder.setSmallIcon(R.drawable.images)
            builder.setAutoCancel(true)

            //2. Intent 생성
            // Intent란 안드로이드 OS에게 저 이거 실행시켜주세요 시키는 것
            var intent1 = Intent(this, TestActivity1::class.java)
            // Notification 눌렀을 때 나오는 Activity에서 데이터를 뽑아쓰기 위해 putExtra.
            intent1.putExtra("data1", "문자열 데이터1")
            intent1.putExtra("data2", 100)

            // 3. 액션 설정
            var intent2 = Intent(this, TestActivity2::class.java)
            intent2.putExtra("data2", "testactivity2 실행")
            var pending2 = PendingIntent.getActivity(this, 100, intent2, PendingIntent.FLAG_UPDATE_CURRENT)
            var builder2 = NotificationCompat.Action.Builder(android.R.drawable.ic_menu_compass, "Action 1", pending2)
            var action2 = builder2.build()
            builder.addAction(action2)


            // 플래그를 꼭 FLAG_UPDATE_CURRENT로 해줘야 데이터가 잘 전달된다.
            var pending1 = PendingIntent.getActivity(this, 10, intent1, PendingIntent.FLAG_UPDATE_CURRENT)
            builder.setContentIntent(pending1)


            var notification = builder.build()
            var manager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            manager.notify(10, notification)

        }