안드로이드 개발자의 창고
[38일차 Android] Pending Intent 본문
출처 : 안드로이드 앱스쿨 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 |