๊ตฌํ ๋ฌธ์
์๋ฆผ ํด๋ฆญํ๋ฉด ํน์ ํ๋ฉด์ ๋์ด์ค์ผ ํ๋ ๋ฌธ์ ์๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
PendingIntent ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค. Notification ์์ฑ์ Intent ์์ฑ์ ๋ถ์ฌํ ์ ์๋๋ฐ ์ด ๋ PendingIntent ๋ฅผ ๋๊ฒจ์ค๋ค. ๋ํ PendingIntent ๊ฐ์ฒด์ putExtra ๋ก ํ๋ฉด ์ด๋์ผ๋ก ๋์ด์ค Fragment ์ ์๋ณ์๋ฅผ ๋๊ฒจ์ค๋ค. ์ด๋ฅผ ํ์ฉํ์ฌ MainActivity ๊ฐ onCreate ๋์ ๋ getStringExtra ๋ก Fragment ์ ์๋ณ์๋ฅผ ๊ฐ์ ธ์ค๊ณ ํด๋น Fragment ๋ก ์ ํํ๋ค.
์ฝ๋
- ReceiverService
์ฐ์ ์ง๋๋ฒ์ ๊ตฌํํ๋ ์ด๋ฒคํธ ์์ ์๋ฆผ์ ๋ํ ์ฝ๋๋ฅผ ๊ฐ์ ธ์๋ค.
// ์ด๋ฒคํธ๋ฅผ ์์ ํ์ ๊ฒฝ์ฐ ์ฌ์ฉ์์๊ฒ ์๋ฆผ ์ ์ก
private fun occurEventNotification() {
val bitmap = BitmapFactory.decodeStream(URL(IMAGE_URL).openConnection().getInputStream())
val intent = Intent(this@ReceiverService, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
putExtra("Fragment", "eventDetailFragment")
}
val pendingIntent: PendingIntent =
PendingIntent.getActivity(this@ReceiverService, 0, intent, 0)
val builder = NotificationCompat.Builder(this@ReceiverService, NOTIFICATION_CHANNEL[1])
.setSmallIcon(R.drawable.ic_baseline_poop_solid_icon)
.setContentTitle("๋ฐฐ๋ณ ์ด๋ฒคํธ ์์ ")
.setContentText("Device 1์์ ๋ฐฐ๋ณ ์ด๋ฒคํธ๊ฐ ์์ ๋์์ต๋๋ค.")
.setLargeIcon(bitmap)
.setStyle(
NotificationCompat.BigPictureStyle()
.bigPicture(bitmap)
.bigLargeIcon(null)
)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setContentIntent(pendingIntent)
.setAutoCancel(true)
// Android 26 ์ด์๋ถํฐ๋ NotificationChannel ๋ฑ๋ก ํ์
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
val channel =
NotificationChannel(
NOTIFICATION_CHANNEL[1],
"์ด๋ฒคํธ ๋ฐ์",
NotificationManager.IMPORTANCE_HIGH
)
val manager =
applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
manager.createNotificationChannel(channel)
}
}
๊ธฐ์กด์ Intent ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ ๊ฐ์ด Context ์ ํ๋ฉด ์ด๋์ ํ Class ๋ฅผ ์ธ์๋ก ๋ฃ์ด์ค๋ค. putExtra ๋ฅผ ํตํด์ ํ๋ฉด ์ด๋์ ํ Fragment ์ ์๋ณ์๋ฅผ ๋ฃ์ด์ค๋ค. Fragment ๊ฐ EventDetailFragment ์ด๊ธฐ์ eventDetailFragment ๋ก ๋ฃ์ด์คฌ๋ค. ์ดํ PendingIntent ์ ์ ์ํ Intent ๋ฅผ ๋๊ฒจ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ Intent ๋ฅผ ์ฌ์ฉํ๋ฉด ์๋๋ ๊ฒ์ผ๊น? ๋์ ์ฐจ์ด์ ์ ์ดํด๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ํ์์ ์ฌ์ฉํ๋ Intent ๋ ํ๋์ ์ฑ(ํ๋ก์ธ์ค) ๋ด๋ถ์์ ํ๋ฉด ์ด๋์ ํ๋ ๊ฒ์ด์์ง๋ง PendingIntent ๋ ํ๋์ ์ฑ์์ ๋ค๋ฅธ ์ฑ์ผ๋ก ํ๋ฉด ์ด๋์ ํ๊ณ ์๋ค. NotificationManager ๊ฐ Intent ๋ฅผ ์คํํ์ฌ ๋ง์น ํ๋์ ์ฑ์์ ํ๋ฉด ์ด๋์ ์คํํ๋ ๊ฒ์ฒ๋ผ ์ฌ์ฉํ๊ฒ ํ๋ค. ์ฆ ๋ค๋ฅธ ํ๋ก์ธ์ค(์๋๋ก์ด๋ ์์คํ
) ์์ Intent ๋ฅผ ์งํํ๋ฏ๋ก PendingIntent ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. Notification ์ธ์๋ ์ฑ ์ธ๋ถ์์ ์ฑ์ ํน์ ํ๋ฉด์ ํธ์ถํด์ผํ๋ ๊ฒฝ์ฐ์ PendingIntent ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. (AlarmManager, Widget)
- MainActivity
์ด๋ ๊ฒ PendingIntent ๋ก MainActivity ๋ฅผ ํธ์ถํ๊ณ MainActivity ๊ฐ onCreate ๋๋ฉด ์ด๋ค Fragment ๋ก ์ด๋ํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ค.
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val targetFragment = intent.getStringExtra("Fragment")
if (targetFragment != null) {
if (targetFragment == "eventDetailFragment") {
saveAndChangeFragment(EventDetailFragment())
} else {
saveAndChangeFragment(DeviceDetailFragment())
}
}
saveAndChangeFragment ๋ฉ์๋๋ FrameLayout ์ ๋์ด์ค Fragment ๋ฅผ ์ง์ ํ๋ค.
fun saveAndChangeFragment(fragment: Fragment) {
supportFragmentManager.beginTransaction()
.replace(binding.fragmentContainer.id, fragment)
.addToBackStack(null)
.commit()
}
๊ฒฐ๊ณผ
ํ์ต์ฉ ์ด๋ฏธ์ง ์ ํ ์๋ฆผ์ ํด๋ฆญ ํ์ ๊ฒฝ์ฐ์ ์์ผ ์ฌ์ฐ๊ฒฐ์ด ์งํ๋๋๋ฐ Intent Flag๋ก NEW_TASK ์ CLEAR_TASK ๋ฅผ ๋๊ฒจ์คฌ๊ธฐ ๋๋ฌธ์ด๋ค.
๋๋ ์
'๐ป ๊ฐ๋ฐ > Android' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Android] ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ผ ํต์ ์ผ๋ก ์ด๋ฒคํธ ์์ ํ ์๋ฆผ (0) | 2022.06.08 |
---|---|
[Android] MVVM ํจํด ์ ์ฉ๊ธฐ - 2 (0) | 2022.05.14 |
[Android] MVVM ํจํด ์ ์ฉ๊ธฐ - 1 (0) | 2022.04.11 |
[Android] ์นด๋ฉ๋ผ ๋๋ ๊ฐค๋ฌ๋ฆฌ์์ ์ด๋ฏธ์ง ๊ฐ์ ธ์ค๊ธฐ (0) | 2022.02.06 |
[Android] ๋ค๊ตญ์ด ์ง์ (0) | 2022.01.13 |