-
Android NotificationAndroid/Component 2019. 7. 25. 17:57
Notification은 앱의 각종 상황을 사용자에게 알릴 목적으로 이용된다.
support 라이브러리에서 NotificationCompat 클래스를 이용하여 하위 호환성을 확보한다
NotificationManager : 알림을 시스템에 발생시키는 SystemService
Notification : 알림 구성 정보를 가지는 객체
NotificationCompat.Builder : 알림을 다양한 정보로 생성
NotificationChannel : 알림의 관리 단위 ( Android Oreo에서 추가 )NotificationManager 객체 얻는 방법은 간단하다
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
1. Notification Manager 와 Builder 생성
class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager val notificationBuilder: NotificationCompat.Builder } }
위에서 말했듯이 하위버전의 호환성을 위해서 NotificationCompat 클래스를 사용한다.
2. Notification Channel 생성하기 ( Android Oreo 추가사항 )
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channelId = "one-channel" val channelName = "My Channel One" val channelDescription = "My Channel One Description" val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_DEFAULT) with(channel) { description = channelDescription enableLights(true) lightColor = Color.RED enableVibration(true) vibrationPattern = longArrayOf(100, 200, 300) notificationManager.createNotificationChannel(channel) notificationBuilder = NotificationCompat.Builder(this@MainActivity, channelId) } } else { notificationBuilder = NotificationCompat.Builder(this@MainActivity) }
별다른건 없다 단순히 버전 분기를 타서 Channel을 생성하여 Builder객체 생성시 추가만 해주면 된다.
NotificationChannel은 일종의 알림에 대한 관리 단위로 볼 수 있다.
3. Notification 구성하기
with(notificationBuilder) { setSmallIcon(android.R.drawable.ic_notification_overlay) setWhen(System.currentTimeMillis()) setContentTitle("Content Title") setContentText("Content Message") setDefaults(Notification.DEFAULT_SOUND or Notification.DEFAULT_VIBRATE) setAutoCancel(true) }
기본적으로 노티에 필요한 값들을 설정해줍니다.
setSmallIcon 알림에 출력될 작은 아이콘 setWhen 시간 setContentTitle 제목 setContentText 본문 setDefaults 기본 설정값들 setAutoCancel 터치 시 자동 삭제 여부, true 값이 지정되면 터치 시 삭제된다. setOngoing 진행표시 여부, true 값이 설정되면 사용자가 슬라이드하여 삭제 불가
4. 이벤트와 인텐트 등록 및 발송
Notification 발생시 유저에 의해 Notification 확장 화면에서 터치가 발생하면 Intent를 발생시키기 위한 PendingIntent 준비한다.
val pendingIntent = PendingIntent.getActivity( this, 0, Intent(this, MainActivity::class.java), PendingIntent.FLAG_UPDATE_CURRENT ) // 필요시 스타일 적용 notificationBuilder.setContentIntent(pendingIntent) notificationManager.notify(2222, notiBuilder.build())
FLAG_CANCEL_CURRENT 이전에 생성한 PendingIntent는 취소하고 새로 만든다 FLAG_UPDATE_CURRENT 현재의 내용으로 이번 객체를 업데이트 한다. FLAG_NO_CREATE 새로운 PendingIntent가 만들어지지 않고 이미 생성된 PendingIntent를 그대로 흭득해서 사용하기 위한 목적으로 사용된다. 만약 만들어진 게 없다면 Null을 반환한다. FLAG_ONE_SHOT 한번만 PendingIntent를 만들기 위해 사용. 이미 만들어진게 있다면 fail 발생 PendingIntent는 인텐트의 정보를 줄테니 필요시에 발생시켜줘라! ( 사용자가 시스템에 의뢰를 할 때 )
식별자 값은 프로그램에서 취소 시킬대 의미가 있다.
5. 여러가지 스타일 지정하기
5-1. action
notiBuilder.addAction(android.R.drawable.ic_menu_share, "ACTION1", pendingIntent)
5-2. BigPicture
val bigPicture = BitmapFactory.decodeResource(resources, R.drawable.androidprofile) val bigStyle = NotificationCompat.BigPictureStyle(notiBuilder) with(bigStyle){ setBigContentTitle("big picture Expanded Title") setSummaryText("big picture Expanded Message") bigPicture(bigPicture) } notiBuilder.setStyle(bigStyle)
5-3. BigText
val bigTextStyle = NotificationCompat.BigTextStyle(notiBuilder) with(bigTextStyle) { setSummaryText("BigText Summary") setBigContentTitle("BigText Title") bigText("동해물과 백두산이 마르고 닳도록 하느님이 " + "보우하사 우리나라 만세 무궁화 삼천리 " + "화려간강 대한사람 대한으로 길이 보전하세") } notiBuilder.setStyle(bigTextStyle)
5-4. Inbox
val inboxStyle = NotificationCompat.InboxStyle(notiBuilder) with(inboxStyle) { addLine("Message 1") addLine("Message 2") addLine("Message 3") addLine("Message 4") setSummaryText("Summary Text") } notiBuilder.setStyle(inboxStyle)
5-5. Indeterminate Progress
Indeterminate는 불확실한이라는 뜻으로 보통 다운로드 준비중일때 많이 사용된다.
notiBuilder.setProgress(0, 0, true) notiManager.notify(222, notiBuilder.build()) SystemClock.sleep(5000L) notiBuilder.setContentText("Download Complete") .setProgress(0, 0, false) notiManager.notify(222, notiBuilder.build())
5-6. Fixed-duration Progress
Fixed-duration은 진행도를 수정한다고 하여 현재 다운로드 진행율 표시에 사용된다.
with(notiBuilder) { for (i in 1..10) { setProgress(10, i, false) notiManager.notify(222, notiBuilder.build()) if (i >= 10) notiManager.cancel(222) SystemClock.sleep(1000L) } }
'Android > Component' 카테고리의 다른 글
Android JobSchduler (0) 2019.07.25 Android Background Limits (0) 2019.07.25 Android Component - Service (0) 2019.07.24 Android Component - Broadcast Service (0) 2019.07.24