본문 바로가기
안드로이드 자바

[JAVA][Android] 알림(Notification) 그룹 설정하기

by teamnova 2024. 8. 17.
728x90

오늘은 알림(Notification)을 보여줄 때, 알림 종류에 따라 다른 그룹으로 보여주는 방법을 알아보겠습니다. 

 

알림에 그룹을 따로 설정하지 않으면, 하나의 앱에서 만든 알림은 하나의 그룹으로 보여집니다. 

그러나 알림 종류에 따라 다른 그룹으로 보여주어야 하는 경우가 있습니다. 

 

이러한 경우에 사용할 수 있도록, 4개의 알림을 2개의 그룹으로 보여주는 예시를 만들어 보겠습니다. 

 

 메니페스트 파일에 추가

<uses-permission android:name="android.permission.POST_NOTIFICATIONS"/>

 

레이아웃 xml 파일 코드 (main.xml )

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="그룹1 - 첫번재 알림"
        android:textSize="20dp"/>

    <Button
        android:id="@+id/button2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="그룹1 - 두번재 알림"
        android:textSize="20dp"/>
    <Button
        android:id="@+id/button3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="그룹2 - 첫번재 알림"
        android:textSize="20dp"/>
    <Button
        android:id="@+id/button4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="그룹2 - 두번재 알림"
        android:textSize="20dp"/>
</LinearLayout>

 


 
xml 파일 코드
(ic_sms.xml )

<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:width="24dp"
    android:height="24dp"
    android:viewportWidth="24.0"
    android:viewportHeight="24.0">
    <path
        android:fillColor="#FF000000"
        android:pathData="M20,2L4,2c-1.1,0 -1.99,0.9 -1.99,2L2,22l4,-4h14c1.1,0 2,-0.9 2,-2L22,4c0,-1.1 -0.9,-2 -2,-2zM9,11L7,11L7,9h2v2zM13,11h-2L11,9h2v2zM17,11h-2L15,9h2v2z"/>
</vector>

 

메인 액티비티 자바 코드

public class MainActivity extends AppCompatActivity {
    private static final String CHANNEL_ID = "테스트 알림";
    private static final String GROUP_1 = "com.example.notification_test.GROUP_1";
    private static final String GROUP_2 = "com.example.notification_test.GROUP_2";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        createNotificationChannels();

        Button button1 = findViewById(R.id.button);
        Button button2 = findViewById(R.id.button2);
        Button button3 = findViewById(R.id.button3);
        Button button4 = findViewById(R.id.button4);

        button1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showNotification("그룹 1 - 알림 1", "1번 그룹의 첫번째 알림입니다. ", CHANNEL_ID, GROUP_1);
                showGroupSummary(CHANNEL_ID, GROUP_1);
            }
        });

        button2.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showNotification("그룹 1 - 알림 2", "1번 그룹의 두번째 알림입니다. ", CHANNEL_ID, GROUP_1);
                showGroupSummary(CHANNEL_ID, GROUP_1);
            }
        });
        button3.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showNotification("그룹 2 - 알림 1", "2번 그룹의 첫번째 알림입니다. ", CHANNEL_ID, GROUP_2);
                showGroupSummary(CHANNEL_ID, GROUP_2);
            }
        });

        button4.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                showNotification("그룹 2 - 알림 2", "2번 그룹의 두번째 알림입니다. ", CHANNEL_ID, GROUP_2);
                showGroupSummary(CHANNEL_ID, GROUP_2);
            }
        });
    }

    private void createNotificationChannels() {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            NotificationChannel channel = new NotificationChannel(
                    CHANNEL_ID,
                    "알림 채널",
                    NotificationManager.IMPORTANCE_HIGH
            );
            channel.setDescription("알림 채널 입니다");

            NotificationManager manager = getSystemService(NotificationManager.class);
            if (manager != null) {
                manager.createNotificationChannel(channel);
            }
        }
    }

    private void showNotification(String title, String content, String channelId, String groupKey) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
                .setSmallIcon(R.drawable.ic_sms)
                .setContentTitle(title)
                .setContentText(content)
                .setGroup(groupKey)
                .setPriority(NotificationCompat.PRIORITY_HIGH);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (notificationManager != null) {
            notificationManager.notify((int) System.currentTimeMillis(), builder.build());
        }
    }

    private void showGroupSummary(String channelId, String groupKey) {
        NotificationCompat.Builder summaryBuilder = new NotificationCompat.Builder(this, channelId)
                .setSmallIcon(R.drawable.ic_sms)
                .setGroup(groupKey)
                .setGroupSummary(true)
                .setPriority(NotificationCompat.PRIORITY_HIGH);

        NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
        if (notificationManager != null) {
            notificationManager.notify(groupKey.hashCode(), summaryBuilder.build());
        }
    }
}