본문 바로가기

안드로이드/코틀린

[안드로이드/Android] 푸시(push) 종류별 구현 방법 및 오레오 대응

반응형

푸시는 사용자에게 정보(광고)를 전달하기 위해 앱 외부의 표시하는 UI입니다. 간단한 텍스트 형태부터 큰 이미지, 큰 텍스트 형태로 표시할 수 있습니다.

 

 

기본 알림 

기본 알림

예제
var title = "알림 타이틀"
var content = "알림 내용"
var bitmap = BitmapFactory.decodeResource(resources, R.drawable.phone)


var builder = NotificationCompat.Builder(this, CHANNEL_ID)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle(title)
                .setContentText(content)
                .setAutoCancel(true)
                .setLargeIcon(bitmap)
                .setShowWhen(true)
                .setColor(ContextCompat.getColor(this, R.color.colorAccent))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)

NotificationManagerCompat.from(this).notify(notiId, builder.build())

알림 생성시 여러가지 옵션을 이용해 커스텀 할 수 있습니다.

  • setSmallIcon : 작은 아이콘 (필수) 
  • setContentTitle : 제목 (필수)
  • setContentText : 내용 (필수)
  • setColor : 알림내 앱 이름 색
  • setWhen : 받은 시간 커스텀 ( 기본 시스템에서 제공합니다 ) 
  • setShowWhen : 알림 수신 시간 ( default 값은 true, false시 숨길 수 있습니다 ) 
  • setOnlyAlertOnce : 알림 1회 수신 ( 동일 아이디의 알림을 처음 받았을때만 알린다, 상태바에 알림이 잔존하면 무음 )
  • setContentTitle : 제목
  • setContentText : 내용
  • setFullScreenIntent : 긴급 알림 ( 자세한 설명은 아래에서 설명합니다 )
  • setTimeoutAfter : 알림 자동 사라지기 ( 지정한 시간 후 수신된 알림이 사라집니다 )
  • setContentIntent : 알림 클릭시 이벤트 ( 지정하지 않으면 클릭했을때 아무 반응이 없고 setAutoCancel 또한 작동하지 않는다 )
  • setLargeIcon : 큰 아이콘 ( mipmap 에 있는 아이콘이 아닌 drawable 폴더에 있는 아이콘을 사용해야 합니다. ) 
  • setAutoCancel : 알림 클릭시 삭제 여부 ( true = 클릭시 삭제 , false = 클릭시 미삭제 )
  • setPriority : 알림의 중요도를 설정 ( 중요도에 따라 head up 알림으로 설정할 수 있는데 자세한 내용은 밑에서 설명하겠습니다. )
  • setVisibility : 잠금 화면내 알림 노출 여부
    • Notification.VISIBILITY_PRIVATE : 알림의 기본 정보만 노출 (제목, 타이틀 등등)
    • Notification.VISIBILITY_PUBLIC : 알림의 모든 정보 노출  
    • Notification.VISIBILITY_SECRET : 알림의 모든 정보 비노출

 

 

 

 

BigTextStyle 알림 

젤리빈(4.1)에 도입된 확장형 알림 템플릿으로 많은 양의 텍스트 표현할때 사용합니다. 기본 알림은 해상도에 따라 일정 텍스트가 넘어가면 ...으로 표현하는데 BigTextStyle 알림은 사용자가 알림을 아래로 드래그 했을때 추가 내용을 표현합니다. 

※스크롤 하기 전과 후의 텍스트를 다르게 설정할 수 있습니다. ( 밑 그림 참조 ) 

최초 수신 알림
드래그 중인 알림
드래그된 알림

예제

만들어 놓은 기본 알림의 스타일을 추가함으로써 BigTextStyle 알림을 표현할 수 있습니다. 

setBigContentTitle : 긴 글 제목 

bigText : 알림을 아래로 당겼을때 보여질 텍스트 

setSummaryText : 알림내 앱명 옆 '요약'

 

var bigContent =
        "dddddddddddddddddddd ddddd aaaaaaaaaaaa  ddddd ddddd ddddd ddddd aaaaaaaaaaaaddddd ddddd ddddd ddddd aaaaaaaaaaaa  ddddd ddddd ddddd ddddd aaaaaaaaaaaa"
var bigContentTitle = "빅콘텐트 타이틀"
var bigContentSummary = "요약"
    
val bigTextStyle = NotificationCompat.BigTextStyle()
					.bigText(bigContent)
					.setBigContentTitle(bigContentTitle)
					.setSummaryText(bigContentSummary)

var builder = NotificationCompat.Builder(this, CHANNEL_ID).setStyle(bigTextStyle)

BigPictureStyle 알림

동일하게 젤리빈(4.1)에 추가됐으며 큰 이미지를 표현할때 사용 됩니다.

드래그된 알림

예제
var bitmap = BitmapFactory.decodeResource(resources, R.mipmap.phone)
val bigPictrueStyle =
                NotificationCompat.BigPictureStyle().bigPicture(bitmap)
 
var builder = NotificationCompat.Builder(this, CHANNEL_ID).setStyle(bigPictrueStyle)

InboxStyle알림

문자열을 줄 바꿔 보여줄때 사용합니다. Inbox알림도 스크롤 했을때 아래와 같이 확인할 수 있습니다.

드래그된 알림

예제
val inboxStyle =NotificationCompat.InboxStyle().addLine("첫번째")
				.addLine("두번째").addLine("두번째").addLine("두번째")
 
var builder = NotificationCompat.Builder(this, CHANNEL_ID).setStyle(inboxStyle)

헤드업 알림

롤리팝(5.0)부터 추가된 헤드업 알림은 상태 표시줄에 단순하게 보여지는 기본 알림들과 다르게, 사용자가 즉시 알수 있도록 스마트폰 상단에 표현 시킵니다. 오레오(8.0) 미만은 알림의 중요도를 HIGH이상으로 하면 생성되지만 오레오(8.0)이상 부터는 채널의 중요도를 HIGH이상으로 설정해야 헤드업 알림이 생성됩니다.

헤드업 알림

예제

오레오(8.0)부터 알림 채널이 추가돼 사용자가 채널 별로 알림 수신 여부 및 기타 설정을 제공합니다. 앱내 알림을 띄우기전에 채널을 생성하지 않으면 알림이 생기지 않습니다. 위의 예제에서 알림 생성시 'CHANNEL_ID'가 생성한 채널 아이디 입니다.

val CHANNEL_ID = "테스트 "
val CHANNEL_NAME = "알림채널 이름"
val CHANNEL_DESCRITION = "알림채널 설명"
    
private fun createChannel() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val importance = NotificationManager.IMPORTANCE_HIGH
            val channel = NotificationChannel(CHANNEL_ID, CHANNEL_NAME, importance).apply {
                description = CHANNEL_DESCRITION

            }
            // Register the channel with the system
            val notificationManager: NotificationManager =
                getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(channel)
        }
    }

채널 생성시 importance가 'IMPORTANCE_HIGH' 이상이어야 헤드업 알림이 가능해집니다. 하지만 채널 생성후 사용자가 앱의 채널 중요도를 설정 화면에서 변경하게되면 앱에서 다시 바꿀 수 없습니다. 생성된 채널에대한 정보는 '앱 설정 > 알림 > 알림 유형' 에서 확인할 수 있습니다. 채널 이름 및 설명은 사용자에게 알림에 대한 정보를 제공합니다.

setFullScreenIntent(pendingIntent, highPriority) : 전화와 같은 중요한 알림을 표시할때 사용하며 사용자가 없애지 않으면 상단에 고정되어 있습니다. 진짜 중요한 경우가 아니면 사용자가 알림을 끌수 있어 사용은 자제해야 합니다. 잠금 화면이 켜져 있는 경우 알림과 함께 인텐트가 실행됩니다.

pendingIntent : 알림 클릭시 인텐트 
highPriority : true 일 경우 다른 알림이 와도 보여주지 않습니다. 
val intent = Intent(this, Main2Activity::class.java).apply {
                flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
            }
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, 0)


var builder = NotificationCompat.Builder(this, CHANNEL_ID)
				.setFullScreenIntent(pendingIntent, false)

※Q부터는 Manifest.permission.USE_FULL_SCRENN_INTENT 권한을 추가하지 않으면 에러가 발생합니다.

 

 

궁금하신 사항은 댓글로 문의주시면 확인하는대로 답변 남기도록 하겠습니다.

 

 

 

이 포스팅은 쿠팡 파트너스 활동의 인활으로, 이에 따른 일정액의 수수료를 제공받고 있습니다.

반응형