Java & Kotlin

[Android] 안드로이드 알림 일정 개수 이상일 때 못 받는 오류 해결

yo0 2025. 3. 27. 23:16

안드로이드는 OS 10이상부터 24개, 그 이전 버전은 50개 알림 상한이 있다.

이 이상 앱 알림이 쌓이면 더이상 새로운 알림을 받지 못하게 된다.

하지만 알림 제한에 도달했어도 편법으로 앱 알림을 받을 수 있는 방법이 있다.

 

일단 내 코드의 경우

 

Notification noti = new NotificationCompat.Builder(this, channelID)
	.setSmallIcon(R.drawable.noti_icon)
    .setColor(Color.gray)
    .setContentTitle('test')
    .setContentText('text1')
    .setAutoCancel(true)
    .setPriority(NotificationCompat.PRIORITY_HIGH)
	.setDefaults(NotificationCompay.DEFAULT_SOUND)
    .build();

 

이런식으로 setGroup, setGroupSummary 같은 그룹 설정을 해주지 않아서 4개 이상일 경우 자동으로 그룹이 된다.

 

 

만약 자동 그룹화를 사용하지 않는경우

 

이렇게 설정하는 경우는 없긴 하겠지만... 만약 아예 그룹화를 못하게 설정했다면

NotificationManager notificationManager = 
    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// 활성화된 알림 리스트 조회
StatusBarNotification[] activeNotifications = notificationManager.getActiveNotifications();

// 알림을 게시 시간 기준으로 정렬 (내림차순, 최신 알림이 첫 번째로 오게)
Arrays.sort(activeNotifications, new Comparator<StatusBarNotification>() {
    @Override
    public int compare(StatusBarNotification sbn1, StatusBarNotification sbn2) {
        return Long.compare(sbn2.getPostTime(), sbn1.getPostTime()); // 내림차순 정렬
    }
});

// 가장 오래된 알림 찾기 (배열의 마지막)
if (activeNotifications.length > 0) {
    StatusBarNotification oldestNotification = activeNotifications[activeNotifications.length - 1];

    // 가장 오래된 알림 제거
    notificationManager.cancel(oldestNotification.getId());
}

// 새로운 알림 생성
Notification newNotification = new NotificationCompat.Builder(this, CHANNEL_ID)
    .setContentTitle("New Noti")
    .setContentText("New Noti Test")
    .setSmallIcon(R.drawable.noti_icon)
    .build();

// 새로운 알림 게시
int newNotificationId = (int) System.currentTimeMillis();  // 새로운 알림 ID
notificationManager.notify(newNotificationId, newNotification);

 

이런식으로 cancel을 사용해 제거가 가능하다.

1. 먼저 notificationManager.getActiveNotifications()으로 내 앱의 알림을 가져왔다.

2. 가져온 알림들이 정렬이 안되어 있어서 알림을 시간 순으로 정렬했다.

3. 마지막에 있는 알림(가장 오래된 알림)을 cancel로 제거 해줬다. 

 

자동 그룹화의 경우

 

하지만..... 자동그룹화의 경우 저 cancel이 작동 하지가 않았는데......

 

그래서 그룹화 일때 가져온 알림들을 확인해보니

마지막 부분이 내 알림이 아닌 ranker_group이라고 auto grouping 할때 쓰는 저게 들어있었다(내 알림들은 tag가 없었다...) 그래서 알림이 아닌 쟤를 지워서 위 코드가 먹히지 않았다. 그래서 마지막이 저 ranker_group이면 그 전에 알림을 조회해서 내 알림이 나왔을 때 제거하면 된다. (if ranker_group이면 뒤에 1개가 아닌 2개 지우면 됨)

 

https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/notification/GroupHelper.java

 

services/core/java/com/android/server/notification/GroupHelper.java - platform/frameworks/base - Git at Google

 

android.googlesource.com


여기보면 ranker_group이 붙는걸 알 수 있음.

 

*주의* 알림을 동시에 날릴 시 get할때 반영이 느리게 적용되어서 알림개수가 혼동될 수 있다. 동시에 날라올 수 있다면 24개는 알림 가져오는게 꼬일 수도 있으니 내 경우 상한을 20개로 두고 지워주는 작업을 하여 해결했다.