#1 ์ด์ ๊ธ
[Android] Notifications - PendingIntent
#1 ์ด์ ๊ธ [Android] Notifications - ๊ธฐ์ด#1 ๊ฐ์ ์๋ฆผ ๊ฐ์ | Views | Android Developers์ด ํ์ด์ง๋ Cloud Translation API๋ฅผ ํตํด ๋ฒ์ญ๋์์ต๋๋ค. ์๋ฆผ ๊ฐ์ ์ปฌ๋ ์ ์ ์ฌ์ฉํด ์ ๋ฆฌํ๊ธฐ ๋ด ํ๊ฒฝ์ค์ ์ ๊ธฐ์ค
kenel.tistory.com
์ ๊ฒ์๊ธ์ ์์ฑ๋ ์ฑ์ ์ผ๋ถ ์์ ํด์, ์๋ฆผ์ Action ๋ฒํผ์ ํด๋ฆญํ๋ฉด ํด๋น ์๋ฆผ์ด ์ ๊ฑฐ(Cancel)๋๊ฒ ๋ง๋ค์ด๋ณธ๋ค.
#2 PendingIntent.getBroadcast()
Intent๋ ์๋๋ก์ด๋์์ ์ปดํฌ๋ํธ(Activity, Service, BroadcastReceiver, ContentProvider) ๊ฐ ํต์ ์ ์ํด ์ฌ์ฉ๋๋ ๋ฉ์์ง ๊ฐ์ฒด๋ผ๋ ๊ฒ์ ๊ธฐ์ตํ์. ์ด์ ๊ฒ์๊ธ์์ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก PendingIntent๋ฅผ ๋ง๋ค์๋ค
private fun getThirdActivityAction(): NotificationCompat.Action {
val intent = Intent(this, ThirdActivity::class.java)
val pendingIntent: PendingIntent = PendingIntent.getActivity(
this, myRequestCode2, intent, PendingIntent.FLAG_IMMUTABLE
)
return NotificationCompat.Action.Builder(0, "Go Third", pendingIntent).build()
}
Activity๋ฅผ ์์ํ๊ธฐ ์ํ Intent๋ฅผ ๋ง๋ค๊ณ , ํด๋น Intent ๊ฐ์ฒด๋ฅผ PendingIntent.getActivity()์ ๋ฃ์ด PendingIntent๋ฅผ ์์ฑํ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด PendingIntent๊ฐ Notification์ Action ๋ฒํผ ํด๋ฆญ ์ ์คํ๋๊ฒ๋ ๋ง๋ค์๋ค. ์ต์ข
์ ์ผ๋ก, ํด๋น PendingIntent์ ๋ด๊ธด Intent์ ์ํด Activity๊ฐ ํธ์ถ๋๋ค.
์ ์ฝ๋๋ฅผ ์ด์ง ๋ฐ๊พธ๋ฉด, PendingIntent์ ๋ด๊ธด Intent๊ฐ BroadcastReceiver๋ฅผ ํธ์ถํ๊ฒ ๋ง๋ค ์ ์๋ค. ์๋ ์ฝ๋๋ฅผ ๋ณด์.
private fun getThirdActivityAction(): NotificationCompat.Action {
val intent = Intent(this, NotificationReceiver::class.java)
.putExtra("notificationId", notificationId)
.putExtra("activityToStart", ThirdActivity::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, myRequestCode2, intent, PendingIntent.FLAG_IMMUTABLE
)
return NotificationCompat.Action.Builder(0, "Go Third", pendingIntent).build()
}
Intent ๊ฐ์ฒด๋ฅผ ๋ง๋ค ๋, ์์ฑ์์ Activity ๋์ BroadcastReceiver๋ฅผ ์ผ๋ค. ๊ทธ๋ฆฌ๊ณ PendingIntent.getActivity() ๋์ PendingIntent.getBroadcast()๋ฅผ ์ฌ์ฉํ๋ค. getActivity()์ getBroadcast() ๋ชจ๋ Context, requestCode, Intent, Flag๋ฅผ ์ธ์๋ก์ ์๊ตฌํ๋ฉฐ PendingIntent ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์ ์์ ๋์ผํ๋, Intent์ ์ง์ ๋ ๊ฒ์ด Activity์ธ์ง BroadcastReceiver์ธ์ง๋ง์ด ๋ค๋ฅด๋ค. ํ ๋ง๋๋ก ์ ์๋ Activity๋ฅผ ์์ํ๊ธฐ ์ํ PendingIntent๋ฅผ ๋ง๋ค๊ณ , ํ์๋ BroadcastReceiver๋ฅผ ์์ํ๊ธฐ ์ํ PendingIntent๋ฅผ ๋ง๋ ๋ค.
#3 ์ฝ๋ ์์
#3-1 MainActivity.kt ์์
...
class MainActivity : AppCompatActivity() {
...
private val notificationId = 777 // ์๋ฆผ ์ฑ๋ Id์๋ ๋ ๋ค๋ฅธ ์๋ฆผ ํ๋ํ๋์ Id. ๋์ผํ Id์ ์๋ฆผ์ด ์ํ๋ฐ์ ์์ ๋, ๊ฐ์ Id์ธ ์๋ฆผ์ ๋ฐ์์ํค๋ฉด, ์๋ ์๋ ์๋ฆผ์ด ์ต์ ์๋ฆผ์ผ๋ก ๊ฐ์๋ผ์์ง๋ค.
override fun onCreate(savedInstanceState: Bundle?) {
...
}
private fun displayNotification() {
...
}
private fun getSecondActivityPendingIntent(): PendingIntent {
...
}
private fun getThirdActivityAction(): NotificationCompat.Action {
val intent = Intent(this, NotificationReceiver::class.java)
.putExtra("notificationId", notificationId)
.putExtra("activityToStart", ThirdActivity::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, myRequestCode2, intent, PendingIntent.FLAG_IMMUTABLE
)
return NotificationCompat.Action.Builder(0, "Go Third", pendingIntent).build()
}
private fun getFourthActivityAction(): NotificationCompat.Action {
val intent = Intent(this, NotificationReceiver::class.java)
.putExtra("notificationId", notificationId)
.putExtra("activityToStart", FourthActivity::class.java)
val pendingIntent = PendingIntent.getBroadcast(
this, myRequestCode3, intent, PendingIntent.FLAG_IMMUTABLE
)
return NotificationCompat.Action.Builder(0, "Go Fourth", pendingIntent).build()
}
...
}
displayNotification()์ ์ง์ญ ๋ณ์์๋ notificationId๋ฅผ ๋ฐ์ผ๋ก ๋นผ์ด ๊ทธ ์ ํจ ๋ฒ์๋ฅผ MainActivity์ ์์ญ๊น์ง ๋ํ๋ค. ๊ทธ๋ฆฌ๊ณ getThirdActivityAction() ๋ฐ getFourthActivityAction()๋ฅผ #2์ ๊ธฐ๋ฐํ์ฌ ์์ ํ๋ค.
#3-2 NotificationReceiver.kt ์์ฑ
// package com.example.notificationcancel
import android.app.NotificationManager
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.os.Build
class NotificationReceiver : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
// Notification ์ทจ์
val notificationId = intent.getIntExtra("notificationId", -1)
notificationManager.cancel(notificationId)
// Activity ์คํ
var activityToStart: Class<*>? = null
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
activityToStart = intent.getSerializableExtra("activityToStart", Class::class.java)
} else {
activityToStart = intent.getSerializableExtra("activityToStart") as Class<*>
}
val activityIntent = Intent(context, activityToStart)
activityIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
context.startActivity(activityIntent)
}
}
์ด ํด๋์ค๋ ํธ์ถ(onReceive())๋๋ฉด, NotificationManager.cancel()๋ก ์๋ฆผ์ ์ ๊ฑฐํ๊ณ , ์๋ก์ด Activity๋ฅผ ์์ํ๋ 2๊ฐ์ง ์์
์ ์ํํ๋ค. getSerializableExtra(name: String)์ API 33๋ถํฐ Deprecated๋์๊ธฐ์ ๋ถ๊ธฐ(if)๋ฌธ์ ๋ฃ์๋ค.
#3-3 AndroidManifest.xml์ ๋ฆฌ์๋ฒ ๋ฑ๋ก
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
<application
...>
<receiver
android:name=".NotificationReceiver"
android:enabled="true"
android:exported="true"></receiver>
<activity
android:name=".FourthActivity"
android:exported="false" />
<activity
android:name=".ThirdActivity"
android:exported="false" />
<activity
android:name=".SecondActivity"
android:exported="false" />
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
์ด ์์
์ ์์ผ๋ฉด ์ ๋๋ค.
#4 ์๋ ํ์ธ

#5 ์์ฝ
Intent์ ์ญํ ์ Activity ์คํ์ ๊ตญํ๋์ง ์๋๋ค.
#6 ์์ฑ๋ ์ฑ
android-practice/notifications/NotificationCancel at master ยท Kanmanemone/android-practice
Contribute to Kanmanemone/android-practice development by creating an account on GitHub.
github.com
'๊นจ์ ๊ฐ๋ ๐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] WorkManager - ๊ธฐ์ด (0) | 2024.06.17 |
---|---|
[Android] WorkManager - ๊ฐ์ (0) | 2024.06.14 |
[Android] Notifications - PendingIntent (0) | 2024.06.12 |
[Android] Notifications - ๊ธฐ์ด (0) | 2024.06.12 |
[Android] Retrofit - Post (0) | 2024.06.11 |