-
[Android] [당근마켓 클론 코딩] 메인페이지 구현2 - 키워드 알림 (Notification)안드로이드 2024. 4. 17. 18:01
✏️ TIL(Today I Learned)
지난번에 이어서 이번에는 종 이미지뷰 클릭 시, 알림이 오도록 설정했다.
채널의 중요도를 IMPORTANCE_HIGH로 설정해서, 헤드업 알림이 뜨는 것을 확인할 수 있다.
알림을 클릭하면 MainActivity로 이동하도록 했다.
우선 AndroidManifest.xml에서 권한을 설정해 준다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <!-- API 33 이상을 위한 알림 권한 추가 --> <uses-permission android:name="android.permission.POST_NOTIFICATIONS" /> ... </manifest>
따로 알림 클래스를 만들었다.
알림을 클릭 시 Intent에 이동할 activity 담아야 하므로, KeywordNotification을 생성할 때 context를 전달하도록 했다.
그리고 Android 8.0 (API 26) 이상의 경우는 알림을 만들기 전에 알림 채널을 먼저 만들어야 한다.
init에서 if문을 사용해서 Android 8.0 이상이면 채널을 만들도록 했다.
채널을 생성하고 알림을 보낼 때, 채널의 ID, NAME 등이 필요하므로 companion class 내의 상수로 선언했다.
class KeywordNotification (private val context: Context) { private var notificationManager: NotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager init { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0 createNotificationChannel() } } private fun createNotificationChannel() { val notificationChannel = NotificationChannel( CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH ).apply { enableVibration(true) setShowBadge(true) description = "Channel Description" } notificationManager.createNotificationChannel(notificationChannel) } fun sendNotification() { val intent = Intent(context, MainActivity::class.java) val pendingIntent = PendingIntent.getActivity( context, NOTIFICATION_ID, intent, PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE ) val notificationTitle = getString(context, R.string.notification_title) val notificationContent = getString(context, R.string.notification_content) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle(notificationTitle) .setContentText(notificationContent) .setContentIntent(pendingIntent) .setAutoCancel(true) .setDefaults(NotificationCompat.DEFAULT_ALL) notificationManager.notify(NOTIFICATION_ID, builder.build()) } companion object { const val CHANNEL_ID = "channel_id" const val CHANNEL_NAME = "channel_name" const val NOTIFICATION_ID = 0 } }
MainActivity에서 종 이미지 뷰에 클릭리스너를 달아서, 클릭 시 알림을 보내도록 했다.
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var keywordNotification: KeywordNotification private lateinit var locationList: Array<String> override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) initView() } private fun initView() { setRecyclerView() setSpinner() keywordNotification = KeywordNotification(this) binding.ivNotification.setOnClickListener { keywordNotification.sendNotification() } }
📝 공부한 Kotlin 정리알림 (Notification)
01. Notification 개요
- 앱의 UI와 별도로 사용자에게 앱과 관련한 정보를 보여주는 기능이다.
- 알림을 터치하여 해당 앱을 열 수 있다.
- 바로 간단한 작업(예 : 문자 답하기)을 할 수 있다. (Android 7.0부터)
- 보통 단말기 상단 부분에 표시되고, 앱 아이콘의 배지로도 표시된다. (Android 8.0부터)
02. 알림 채널(Android 8.0 이상)
- Android 8.0 이상의 경우는 알림을 만들기 전에 알림 채널을 먼저 만들어야 한다.
- 알림 채널은 알림을 그룹으로 만들어, 알림 활성화나 방식을 변경할 수 있다.
private val myNotificationID = 1 private val channelID = "default" private fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { // Android 8.0 val channel = NotificationChannel(channelID, "default channel", NotificationManager.IMPORTANCE_DEFAULT) channel.description = "description text of this channel." val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } }
03. 알림 생성
- NotificationCompat.Builder 객체에서 알림에 대한 UI정보와 작업을 지정
- setSmallIcon() : 작은 아이콘
- setContentTitle() : 제목
- setContentText() : 세부 텍스트
- NotificationCompat.Builder.build() 호출
- Notification객체를 반환
- NotificationManagerCompat.notify() 호출하여 시스템에 Notification객체를 전달
private val myNotificationID = 1 private fun showNotification() { val builder = NotificationCompat.Builder(this, channelID) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle("title") .setContentText("notification text") .setPriority(NotificationCompat.PRIORITY_DEFAULT) NotificationManagerCompat.from(this).notify(myNotificationID, builder.build()) }
04. 알림 중요도
사용자가 볼 수 있는 중요도 수준 중요도
(Android 8.0 이상)우선순위
(Android 7.1 이하)긴급
알림음이 울리며 헤드업 알림으로 표시됩니다.IMPORTANCE_HIGH PRIORITY_HIGH 또는 PRIORITY_MAX 높음
알림음이 울립니다.IMPORTANCE_DEFAULT PRIORITY_DEFAULT 중간
소리가 나지 않습니다.IMPORTANCE_LOW PRIORITY_LOW 낮음
알림음이 없고 상태 표시줄에 표시되지 않습니다.IMPORTANCE_MIN PRIORITY_MIN 없음
알림음이 울리지 않으며 상태 표시줄이나 창에
표시되지 않습니다.IMPORTANCE_NONE N/A
📌 공식 문서
'안드로이드' 카테고리의 다른 글
[Android] [당근마켓 클론 코딩] 메인페이지 구현3 - 커스텀 Floating Button (RecyclerView/ AlphaAnimation) (0) 2024.04.19 [Android] [당근마켓 클론 코딩] 메인페이지에서 아이템 상세페이지로 data class 객체를 intent로 전달 (Parcelize) (0) 2024.04.18 [Android] [당근마켓 클론 코딩] 메인페이지 구현1 (RecyclerView/ addItemDecoration()/ Spinner/ ArrayAdapter) (0) 2024.04.16 [Android] Fragment 데이터 전달 (0) 2024.04.11 [Android] 간단한 RecyclerView (0) 2024.04.11