안드로이드 아이콘 뱃지 완전분해

뱃지 적용 경험담

marojun
marojun’s Android
9 min readFeb 11, 2014

--

이미지처럼 아이콘 위에 보이는 숫자가 있다. 읽지 않은 새로운 소식이 얼마나 있는지를 알려주기 위해 보여주는것인데 이를 Badge(뱃지)라고한다.

사실 해당 기능은 특정 Launcher에서 지원해주는 기능으로 Pure Android에서는 찾아볼 수 없다. 즉, 넥서스 시리즈와 같이 구글에서 판매하는 폰에서는 해당기능을 사용할 수 없는 것이다. 다시 말하자면 구글에서 권장하지 않는다고도 추측 할 수 있겠다.

그럼에도 불구하고 해당 기능을 사용하고 싶다면 각각의 Launcher에 정해져 있는 규약을 통해 사용하도록 한다. 여기서는 2가지 타입의 규약을 통해 뱃지를 노출시키는 방법, 그리고 적용시 발생된 이슈들에 대해 논의해 보도록하겠다.

뱃지 카운트 업데이트 방식

현재까지 확인결과 뱃지 카운트를 업데이트 하는 방식에는 2가지가 있었다.

Type1. “android.intent.action.BADGE_COUNT_UPDATE” - android에 정의된 intent로 뱃지를 업데이트.

Type2. “android.intent.action.특정 앱 이름_COUNT_UPDATE” - 런처와 특정 앱이 사전에 약속된 액션을 만들어 해당 앱에 대해서만 뱃지 업데이트.

이에 각각의 업데이트 방식을 통해 테스트를 진행하였다.

Type1. android.intent.action.BADGE_COUNT_UPDATE

Type1의 경우 앞에서 설명했다시피 안드로이드에 정의된 intent로 뱃지를 업데이트 하기 때문에 이론적으로 삼성, 엘지, 팬택 등의 런처에서 해당 규격을 적용했다면 모두 동작한다.

먼저 해당 타입으로 테스트한 결과를 보자. (테스트는 단말 및 OS별로 진행하였다.)

삼성전자 : 구글 런처 설치 제외된 모든 단말 사용가능.

엘지전자 : 옵티머스 G 포함하여 이후 제조된 단말 사용가능.

팬택 : 베가 아이언 포함하여 이후 제조된 단말 사용가능.

엘지, 팬택의 경우 뱃지기능가능 기준이되는 단말 이전에 제조된 모델의 경우에도 제조사가 뱃지기능을 가능하도록 업데이트를 진행한 경우에는 사용 가능하다. 그러나 이것은 사용자의 선택이기 때문에 업데이트를 진행하지 않은 경우에는 사용할 수 없다는 것을 명심하자.

현재 3사 모두 Type1방식을 권장하고 있다. 하지만 결과를 보면 모든 단말에서 동작하지 않음을 알 수 있는데 그나마 다행인건 최근에 출시된 단말들에 대해서는 3사 모두 동작한다는 것이다.

해당 규격의 테스트 코드는 다음과 같다.

Type2. android.intent.action.특정앱_COUNT_UPDATE

해당 방식은 뱃지 카운트 기능을 연동할 서비스와 런처 사이에 별도의 규약을 만들어서 해당 앱에 대해서만 뱃지 카운트를 증가시키는 방식이다.

과거 특정 런처에서 android.intent.action.BADGE_COUNT_UPDATE 를 사용하지 않았던 시절에 사용하던 방식 중 하나이다.

해당방식을 통해서도 업데이트가 되는 단말, 되지 않는 단말이 나뉘며 3사의 최근 단말의 순정 런처에서는 해당 방식은 동작하지 않았다.

결론적으로 해당 방식을 통한 적용은 배제하였다.

Type1 방식을 통한 테스트 시 발생한 이슈사항 정리

이슈1. 삼성 런처에서 프로그램적으로 숏컷(단축 아이콘) 생성 시 뱃지 카운트 동기화 문제

삼성 런처에서는 Type1방식으로 모두 뱃지 카운트가 노출된다고 했는데 여기에도 이슈사항은 있었다.

일반적으로 앱을 설치하면 Home screen에 바로 노출되는 것이 아니라 Home screen에서 All Apps 버튼을 클릭하면 나오는 All apps screen에만 노출되게 된다.

그러나 특정앱의 경우 앱 설치와 동시에 Home screen에 숏컷 아이콘을 생성하는 경우가 있는데, 이런경우 All apps screen에 보이는 현재 아이콘의 이미지를 캡쳐하여 Home screen에 노출시켜 뱃지카운트가 갱신되지 않는 문제가 발생한다. (물론 All apps screen의 아이콘 뱃지 카운트는 갱신된다. )

“왜 이미지를 캡쳐한다고 생각하는가?” 에 대한 답변은 이렇다. All apps screen에 뱃지 카운트가 “2"라고 되어있는 상태에서 프로그램적으로 숏컷을 생성하면 뱃지 카운트가 “2"인 숏컷이 생성된다. “5"로 되어있는 상태에서는 카운트가 “5"인 숏컷이 생성된다. 그러나 생성 이후 Home screen 숏컷의 카운트는 변경되지 않는다. 이에 숏컷이 생성되는 시점의 All apps screen아이콘을 그대로 캡쳐하여 사용한다고 추측하였다.

사실 아이콘은 “아이콘의 이름” , “아이콘의 이미지” 그리고 “아이콘의 뱃지 카운트” 등의 아이템이 모여있는 그룹이다. 그러나 프로그램적으로 생성한 숏컷의 경우는 통 이미지로 생성되어 각각의 아이템을 컨트롤 할 수 없어 해당현상이 발생되는 것이다.

그러나 재미있게도 사용자가 직접 All apps screen에서 아이콘을 롱클릭하여 Home screen으로 빼내 숏컷을 생성한 경우는 뱃지 카운트가 변경된다.

그렇다면 숏컷을 만들때 이미지가 아닌 아이템의 그룹 형태로의 생성이 아예 불가능하지 않다는 것이므로 혹시 프로그램적으로 숏컷을 만드는 부분이 잘못된것이 아닌지 분석해보았다.

분석결과 위 코드를 보면 알겠지만 일반적인 숏컷 생성 코드였다. 이에 이슈를 해결하기 위한 방법을 2가지로 분류하였다.

  1. 프로그램적으로 일반적인 숏컷 생성 방법이 아닌 다른 방법을 사용한다.
  2. 프로그램적으로 숏컷을 생성하지 않는다.

첫번째 방법으로 해결할 수 있는 방법이 있는지 숏컷 이외에 홈스크린에 아이콘을 노출시킬 수 있는 방법을 찾아보았다.

먼저 아이콘은 아래와 같이 2가지 타입을 갔는다.

  1. 홈 어플리케이션 — 디바이스 제작시 기본적으로 홈스크린에 노출되도록 한 아이콘 이나 사용자가 All apps screen에서 홈 스크린으로 드래그하여 직접 아이콘을 생성한 경우
  2. 숏컷- 프로그램적으로 아이콘을 생성한 경우

삼성 단말의 경우 홈 어플리케이션에 대해서만 뱃지기능을 지원한다. 이것은 숏컷의 경우 앱이 아니라 특정 웹페이지의 단축 아이콘 등의 것들을 등록 할 수 있기때문이라고 한다. 또한 홈 어플리케이션은 프로그램적으로 생성할 수 없기에 해당현상은 삼성 런처에서는 정상적인 플로우로 인식된다.

즉, 해당 이슈는 숏컷 생성을 하지않도록 하던지, 숏컷을 생성한다면 뱃지 카운트가 비노출 될 수 밖에 없다는 점을 감안해서 서비스해야 할것이다.

이슈2. 삼성 런처에서 뱃지 카운트 변경 요청시 숏컷 중복 생성

삼성 단말에서 테스트 중 몇대의 단말에서 뱃지 카운트 변경 요청시 숏컷이 중복으로 생성되는 현상이 있었다. 이 이슈는 테스트 기준으로 삼성 단말의 특정 OS버전(4.0.4)에서 발생하였는데 이부분에 대해서는 테스트 단말이 비 정상적일 수 있으니 직접 테스트 후 적용하도록한다.

이슈3. 앱 삭제후 해당앱 다시 설치 시 이전 뱃지 카운트가 남아있는 경우

코드를 통해 뱃지 카운트를 “11"로 변경했다고 하자. 이 경우 사용자가 해당 앱을 삭제하고 다시 설치하여도 아이콘에 “11"이라는 뱃지가 그대로 남아있게 된다. 이유는 해당 앱의 뱃지카운트를 런처에서 저장하기 때문이다.

즉, 해당 앱을 지운다고해도 런처에는 해당앱의 패키지명과 클래스명 기준으로 뱃지 카운트가 저장되어 있기때문에 다시 설치할 경우 기준이 같으므로 데이터를 재사용하게 되는 것이다.

이에대한 해결방법을 생각해보았다.

  1. 앱이 언인스톨 되는것을 알려주는 콜백이 있다면 해당부분에서 뱃지카운트를 초기화 해준다. -> 콜백이 없으므로 불가능.
  2. 앱이 설치되고 첫 구동인 경우 숏컷 생성전에 뱃지 카운트를 초기화.

여기서는 2번 방법으로 적용하여 해결하였다.

여기까지가 뱃지 기능 적용기입니다. 혹시 궁금한 점이나 문의 사항이 있으시면 댓글이나 트위터(ID : @_marojun)로 글 남겨주시면 답변 드리겠습니다. 감사합니다.

--

--

marojun
marojun’s Android

전슬마로. KTH, SK Planet, NCSOFT 에서 iOS와 Android를 개발하고 있다. — 안드로이드 개발 그룹 https://www.facebook.com/groups/junsle/