ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Android Notification
    Android/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

    댓글

Designed by Tistory.