Things take time

[Android] 앱 아이콘에 뱃지(Badge) 표시하기 본문

Android(기능)

[Android] 앱 아이콘에 뱃지(Badge) 표시하기

겸손할 겸 2017. 7. 1. 18:07

[코드]

        Intent badgeIntent = new Intent("android.intent.action.BADGE_COUNT_UPDATE");
        badgeIntent.putExtra("badge_count", badgeCount);
        badgeIntent.putExtra("badge_count_package_name", getPackageName());
        badgeIntent.putExtra("badge_count_class_name", getLauncherClassName());
        sendBroadcast(badgeIntent);

카메라, 앨범을 호출하는 것처럼 상수 값인 인텐트 액션 값을 주면 된다.

여기서 badgeCount는 당연히 int값이며 getPackageName()은 현재 패키지명을 가져오는 함수.. 중요한 것은 세 번째의 클래스 이름인데, 여기에 들어가는 클래스 이름은 앱이 처음에 실행되는 액티비티 클래스의 이름이다.


만약 MainActivity.class가 첫 액티비티 클래스라면 그 이름을 써도 되는데, 나 같은 경우는 인트로 화면 전용 클래스를 따로 두고 일정 시간이 지나면 MainActivity로 이동하기 때문에 런처(처음 실행되는)화면을 구하는 함수를 구글링을 통해!

 private String getLauncherClassName() {
        Intent intent = new Intent(Intent.ACTION_MAIN);
        intent.addCategory(Intent.CATEGORY_LAUNCHER);
        PackageManager pm = getApplicationContext().getPackageManager();
        List resolveInfos = pm.queryIntentActivities(intent, 0);
        for (ResolveInfo resolveInfo : resolveInfos) {
            String pkgName = resolveInfo.activityInfo.applicationInfo.packageName;
            if (pkgName.equalsIgnoreCase(getPackageName())) {
                return resolveInfo.activityInfo.name;
            }
        }
        return null;
    }

[넣을 위치는?]


위의 소스코드를 넣을 시점은 어디가 좋을까? 당연 푸시를 받는 시점이다.

FCM기준으로 두 개의 서비스를 상속받는 클래스 두 개를 생성하게 된다. 그 중 FirevaseMessagingService를 상속받는 클래스의 sendNotification 메소드 혹은 onMessageReceived 메소드에 구현하면 되겠다.


나 같은 경우, 푸시가 오면 뱃지 카운트를 +1로 해주는데.. 이 뱃지 카운트(BadgeCount 변수)는 푸시를 누르고 앱에 들어갔을 때 0으로 초기화 시켜줘야하므로.. 폰 DB중 SharedPreference에 저장했다. (SQLite에 저장하는 것은 사치다, 물론 테이블 구조로 만들어서 좀 더 세분화 하겠다면 써야한다)


그리고 앱이 실행되는 resume(create는 앱이 처음 실행될 때만 호출되므로 뱃지에는 사용하지 않는 것이 좋다)에서 뱃지 카운트를 검사하는 함수를 호출하여 해당 카운트 값이 0이상이라면 0으로 초기화하는 것으로 사용했다.


이렇게하면 다른 일반적인 앱들이 사용하는 방식, 앱으로 들어갔을 때 뱃지 카운트 0, 푸시가 오게 되면 ++가 되는 로직이 완성된다.


이제 여기에 좀 더 덧붙여서 푸시를 받기 설정에 따라 사전 작업들을 들어가야 할 것이다. 그것은 각 어플의 기획에 따라 진행하면 된다.