본문 바로가기

Android

[Android]안드로이드 오레오 버전 알림 채널 및 그룹(Notification Channel, Group) 간단 사용법

반응형

안드로이드 오레오 버전부터는 알림을 사용할 때 채널 및 그룹을 설정하도록 되어있습니다.


targetSdkVersion을 25이하로 한다면 상관이 없지만 26이상으로 설정하신다면


아래와 같은 방법으로 채널을 등록하고 관리하셔야합니다.

설명은 필요없고 코드만 필요하신 분들은

https://github.com/NewLand-Ju/NotificationStudy

여기서 다운받으셔서 살펴보실 수 있습니다.



테스트를 위한 레이아웃은 아래와 같습니다.





MyNotificaion을 object로 작성하여서 Singleton의 역할을 하도록 만들었습니다.


createChannel 함수를 사용하여 알림 그룹과 채널들을 생성합니다.

Channel 및 Group은 여러번 생성할 필요가 없기 때문에

회원가입시에 createChannel을 사용하시거나 기타 다른 방법들을 이용해서 호출하시면 됩니다.

만약 알림 그룹을 생성할 필요가 없다면 NotificationChannelGroup 생성 및 설정 부분은 생략하셔도 무방합니다.


deleteChannel은 이름 그대로 채널을 제거하는 함수입니다.

제거된 채널을 다시 생성하시고 싶으시다면 별도로 채널을 생성하는 함수를 만드시거나

createChannel을 다시 호출하시면 됩니다.


sendNotification 함수에서 기존하고 달라진 점은 Channel을 별도로 지정해줘야 한다는 점입니다.

생성자에서 지정할 수도 있고 setChannel을 이용해서 지정하실 수도 있습니다.


오레오 버전 미만이라서 Channel을 생성하지 않았다고 걱정하지 않으셔도 됩니다.

null이 아닌 어떤 값이라도 지정하시면 정상적으로 알림을 보낼 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
/**
 * MyNotification
 * Created by judh on 2018. 2. 14..
 */
object MyNotification {
 
    const val MESSAGE = "Message"
    const val COMMENT = "Comment"
    const val NOTICE = "Notice"
 
    private fun getManager(context: Context) = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
 
    fun createChannel(context: Context, id: String=
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                /**
                 * NotificationChannelGroup 생성
                 * 생성시 입력한 id를 이용하여 각각의 채널에 그룹 설정 가능
                **/
                val notificationChannelGroup = NotificationChannelGroup(id, "Group : $id")
                getManager(context).createNotificationChannelGroup(notificationChannelGroup)
 
                val channelMessage = NotificationChannel(MESSAGE + id, MESSAGE, NotificationManager.IMPORTANCE_HIGH)
                channelMessage.description = "${id}의 $MESSAGE"
                channelMessage.group = id // channel에 그룹 설정 (ChannelGroup 사용을 안할거면 생략가능)
                channelMessage.lightColor = Color.GREEN
                channelMessage.lockscreenVisibility = Notification.VISIBILITY_PRIVATE
                getManager(context).createNotificationChannel(channelMessage)
 
                val channelComment = NotificationChannel(COMMENT + id, COMMENT, NotificationManager.IMPORTANCE_LOW)
                channelComment.description = "${id}의 $COMMENT"
                channelComment.group = id
                channelComment.lightColor = Color.YELLOW
                channelComment.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
                getManager(context).createNotificationChannel(channelComment)
 
                val channelNotice = NotificationChannel(NOTICE + id, NOTICE, NotificationManager.IMPORTANCE_DEFAULT)
                channelNotice.description = "${id}의 $NOTICE"
                channelNotice.group = id
                channelNotice.lightColor = Color.RED
                channelNotice.lockscreenVisibility = Notification.VISIBILITY_PUBLIC
                getManager(context).createNotificationChannel(channelNotice)
            } else {
                showToastMessage(context)
            }
 
    fun deleteChannel(context: Context, channel: String=
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                getManager(context).deleteNotificationChannel(channel)
            } else {
                showToastMessage(context)
            }
 
    fun sendNotification(context: Context, id: Int, channel: String, title: String, body: String) {
        val builder = NotificationCompat.Builder(context, channel)
                .setContentTitle(title)
                .setContentText(body)
                .setSmallIcon(android.R.drawable.stat_notify_chat)
                .setAutoCancel(true)
 
        getManager(context).notify(id, builder.build())
    }
 
    fun showToastMessage(context: Context) = Toast.makeText(context, "This device's OS is less than Oreo", Toast.LENGTH_SHORT).show()
}
cs





아래의 코드는 위에서 작성한 MyNotification을 사용하는 Activity입니다.


각각의 버튼들을 클릭하여 동작 테스트를 해보실 수 있습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
class MainActivity : AppCompatActivity() {
 
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
 
        btn_create.setOnClickListener { MyNotification.createChannel(thisif (edit_group_id.text.isNotEmpty()) edit_group_id.text.toString() else "Default") }
        btn_message.setOnClickListener { MyNotification.sendNotification(this1, MyNotification.MESSAGE + edit_group_id.text.toString(), "MESSAGE_TITLE""MESSAGE_BODY") }
        btn_comment.setOnClickListener { MyNotification.sendNotification(this2, MyNotification.COMMENT + edit_group_id.text.toString(), "COMMENT_TITLE""COMMENT_BODY") }
        btn_notice.setOnClickListener { MyNotification.sendNotification(this3, MyNotification.NOTICE + edit_group_id.text.toString(), "NOTICE_TITLE""NOTICE_BODY") }
 
        btn_delete_comment.setOnClickListener { MyNotification.deleteChannel(this, MyNotification.COMMENT + edit_group_id.text.toString()) }
        btn_setting_message.setOnClickListener { goToNotificationSettings(MyNotification.MESSAGE + edit_group_id.text.toString()) }
        btn_setting.setOnClickListener { goToNotificationSettings() }
    }
 
    private fun goToNotificationSettings(): Any =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Intent(Settings.ACTION_APP_NOTIFICATION_SETTINGS).apply {
                    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
                    startActivity(this)
                }
            } else {
                MyNotification.showToastMessage(this)
            }
 
 
    private fun goToNotificationSettings(channel: String): Any =
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                Intent(Settings.ACTION_CHANNEL_NOTIFICATION_SETTINGS).apply {
                    putExtra(Settings.EXTRA_APP_PACKAGE, packageName)
                    putExtra(Settings.EXTRA_CHANNEL_ID, channel)
                    startActivity(this)
                }
            } else {
                MyNotification.showToastMessage(this)
            }
}
cs



아래는 각각 오레오 버전 이상과 미만에서의 동작을 보여주는 동영상입니다.









반응형