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

안녕하세요,  Commerce S/W 개발1팀의 전슬마로입니다.  이번 포스팅에서는  안드로이드 아이콘 뱃지에 대한 내용으로 말씀 드리려고 합니다.

그림1. Messaging 아이콘에 적용되어 있는 뱃지

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

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

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

뱃지 카운트 업데이트 방식

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

Type 1. “android.intent.action.BADGE_COUNT_UPDATE” – android에 정의된 intent로 뱃지를 업데이트.

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

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

“Type1. android.intent.action.BADGE_COUNT_UPDATE” TEST

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

이에 대한 구현 코드와 이를 통해 제조 3사 50여종 단말에 대한 테스트한 결과는 다음과 같습니다.

Intent intent = new Intent(“android.intent.action.BADGE_COUNT_UPDATE”); 
// 패키지 네임과 클래스 네임 설정 
intent.putExtra(“badge_count_package_name”, getComponentName().getPackageName()); 
intent.putExtra(“badge_count_class_name”, getComponentName().getClassName()); 
// 업데이트 카운트 
intent.putExtra(“badge_count”, count); sendBroadcast(intent);

1. 삼성 단말

모델명

OS

뱃지 카운트 작동유무

특이사항

1

갤럭시S2 LTE (SHV-E110S)

2.2.1

O

2

갤럭시S2 LTE (SHV-E110S)

2.3.6

O

3

갤럭시S2 HD (SHV-E120S)

4.0.4

O

뱃지 생성코드를 호출하는 만큼 아이콘 생성

(아이콘 중복검사 무시)

4

갤럭시S2 HD (SHV-E120S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

6

갤럭시 노트 (SHV-E160S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

7

갤럭시R 스타일 (SHV-E170S)

4.0.4

O

Short cut 의 뱃지 카운드 변경 X

8

갤럭시R 스타일 (SHV-E170S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

9

갤럭시S3 LTE (SHV-E210S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

10

갤럭시S3 LTE (SHV-E210S)

4.0.4

O

Short cut 의 뱃지 카운드 변경 X

11

갤럭시S3 LTE (SHV-E210S)

4.3

O

12

갤럭시S4 액티브 (SHV-E470S)

4.2.2

O

Short cut 의 뱃지 카운드 변경 X

13

갤럭시S2 (SHW-M250S)

2.3.3

O

14

갤럭시S2 (SHW-M250S)

4.0.4

O

뱃지 생성코드를 호출하는 만큼 아이콘 생성

(아이콘 중복검사 무시)

15

갤럭시 노트2 (SHV-E250S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

16

갤럭시 프리미어 (SHV-E220S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

17

갤럭시 그랜드 (SHV-E270S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

18

갤럭시S4 (SHV-E300S)

4.2.2

O

Short cut 의 뱃지 카운드 변경 X

19

갤럭시S4 LTE-A (SHV-E330L)

4.2.2

O

Short cut 의 뱃지 카운드 변경 X

20

갤럭시 M 스타일 (SHW-M340S)

2.3.6

O

21

갤럭시S3 3G (SHW-M440S)

4.0.4

O

Short cut 의 뱃지 카운드 변경 X

22

갤럭시S3 3G (SHW-M440S)

4.1.2

O

Short cut 의 뱃지 카운드 변경 X

23

갤럭시 넥서스 (Galaxy Nexus)

4.0.2

X

구글 런처

24

갤럭시 넥서스 (Galaxy Nexus)

4.1.1

X

구글 런처

2. LG 단말

모델명

OS

뱃지 카운트 작동유무

특이사항

1

옵티머스 LTE (LG-SU640) 2.3.5

X

2

옵티머스 LTE (LG-SU640) 4.0.4

X

3

옵티머스 Tag (LG-F120S)

4.0.4

X

4

옵티머스 LTE2 (LG-F160S)

3.4.0

O

5

옵티머스 LTE2 (LG-F160S) 4.0.3

X

6

옵티머스 G  (LG-F180S) 4.0.4

O

7

옵티머스 G (LG-F180S) 4.1.2

O

8

옵티머스 뷰2 (LG-F200S) 4.0.4

O

9

옵티머스 G Pro (LG-F240S)

4.1.2

O

10

옵티머스 LTE3 (LG-F260S)

4.1.2

O

11

옵티머스 뷰3 (LG-F300S)

4.2.2

O

12

G2 (LG-F320S)

4.2.2

O

13

넥서스4 (Nexus 4)

4.3

X

구글 런처

14

넥서스5 (Nexus 5)

4.4

X

구글 런처

3. 팬택 단말

모델명

OS

뱃지 카운트 작동유무

특이사항

1

베가 LTE M (IM-A810S)

2.3.5

X

2

베가 LTE M (IM-A810S)

4.0.4

X

3

베가레이서 2 (IM-A830S)

4.0.4

X

4

베가레이서 2 (IM-A830S)

4.0.3

X

5

베가 S5 (IM-A840S)

4.1.2

O

6

베가 S5 (IM-A840S)

4.0.4

X

7

베가 S5 (IM-A840S)

4.1.2

X

8

베가 R3 (IM-A850S)

4.0.4

X

9

베가 R3 (IM-A850S)

4.1.2

X

10

베가 아이언 (IM-A870S)

4.1.2

O

11

베가 LTE-A (IM-A880S)

4.2.2

O

12

베가 시크릿 (IM-A890S)

4.2.2

O

위 테스트 결과를 통해 도출된 결론은 아래와 같습니다. (특이사항에 대해서는 다음 장에 자세히 다루겠습니다)

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

– LG전자 : 옵티머스 G 포함하여 이후 제조된 단말 사용가능. (구글 런처 설치 단말 제외)

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

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

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

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

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

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

그림2. Home screen(왼쪽)과  All apps screen(오른쪽)

일반적으로 앱을 설치하면 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으로 빼내 숏컷을 생성한 경우는 뱃지 카운트가 변경됩니다.

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

// 매니페스트에 숏컷 생성을 위한 권한 설정 
<uses-permission android:name=”com.android.launcher.permission.INSTALL_SHORTCUT”/> 
<uses-permission android:name=”com.android.launcher.permission.UNINSTALL_SHORTCUT”/> 
// 숏컷 생성할 클래스에서의 코드 
Intent shortcutIntent = new Intent(Intent.ACTION_MAIN); 
shortcutIntent.setClassName(getApplicationContext(), MyActivity.class.getName()); 
Intent intent = new Intent(); intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcutIntent); 
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, getResources().getString(R.string.app_name)); 
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON_RESOURCE, Intent.ShortcutIconResource.fromContext(getApplicationContext(), R.drawable.ic_launcher)); 
intent.putExtra(“duplicate”, false); intent.setAction(“com.android.launcher.action.INSTALL_SHORTCUT”); 
sendBroadcast(intent);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

“Type2. android.intent.action.특정앱_COUNT_UPDATE” TEST

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

과거 특정 런처에서 android.intent.action.BADGE_COUNT_UPDATE 를 사용하지 않았던 시절에 사용하던 방식으로 현재 위 방식을 사용할 경우 동작하는 단말과 하지 않는 단말로 나뉘며 특히 최근에 생산된 제조 3사의 단말의 경우 해당 방식은 동작하지 않습니다.

그렇다면 이렇게 생각해 볼 수도 있습니다. “코드에 case 1, 2 방법 모두 적용하면 되지 않을까?”

그러나 여기서 문제인 것은 해당 기능의 과도기 시점에서 제조사가 case 1과 case 2를 동시에 사용할 수 있도록 적용한 버전이 있다는 것입니다. 이에 해당기기의 경우 case 1, 2를 동시에 코드에 적용할 경우 한번에 카운트가 “2”씩 올라가는 현상이 발생합니다. 결론적으로 해당 방식을 통한 적용은 현재로서는 배제하는 것이 옳습니다.

마치며

여러 프로젝트를 진행하면서 많은 기획자 분들이 해당기능에 대해서 구현이 가능한지, 가능하다면 모든 단말에서 가능한지에 대해 물어보셨으나 항상 명확한 기준을 몰라 반영하지 못했던 경우가 있었습니다. 이에 기회가 되어 여러 단말에서의 테스트 및 제조사 홈스크린 담당자 분들과의 커뮤니케이션을 통해 이번 글을 정리하게 되었습니다. 이 글을 통해 이후 같은 경험을 겪을 분들에게 부디 도움이 되었으면 합니다.

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

전슬마로 Commerce SW개발팀

안녕하세요. 전슬마로 매니저 입니다. Commerce SW개발팀에서 스마트 월렛 개발을 담당하고 있습니다.

Facebook 

공유하기