안드로이드 상태바 아이콘 변경하기

|
안드로이드 홈 화면 상단은 기본적으로 세부분으로 이루어져 있습니다.

가장 왼쪽의 IconMerger부분(적색)은 어플리케이션에서 등록/관리가 가능하고, 이 기능은 SDK상에 오픈되어 있습니다.
가운데의 StatusBar부분(녹색배경)부분은 시스템 Notification이 올라오는 부분이며 이부분은 SDK상에 오픈되어 있지 않습니다.
그리고 가장 오른쪽의 시간 표시 부분.
사용자 삽입 이미지
이 포스트에서는 시스템 노티가 올라오는 가운데 부분 아이콘들에 대해 설명합니다.
물론 SDK상에 오픈되어 있지 않으므로 프레임워크 소스를 수정해야 합니다.
(소스는 GingerBread 기준으로 설명합니다.)


이 부분의 아이콘은 "slot"이라는 형태로 관리가 됩니다.
각 아이콘마다 슬롯이 지정되어 있고, 이 슬롯을 보이게 하거나 숨기거나 하는 식으로 표시가 됩니다.
슬롯에는 인덱스가 있고, 이 인덱스가 아이콘을 보이게 하는 순서가 됩니다.

만약 이 부분에 새로운 아이콘을 추가하고자 하면, 먼저 슬롯을 추가해 주어야 합니다.
이 정의는 리소스상에 xml형태로 정의되어 있고, 리소스의 위치는 com.android.internal.R.array.config_statusBarIcons 입니다.

실제 파일 위치는 frameworks/base/core/res/res/value/config.xml 입니다.
(언어에 따른 별도의 위치는 설명하지 않습니다.)

이 파일에 보면, 다음과 같은 부분이 있습니다.
[code xml]
    <string-array name="config_statusBarIcons">
       <item><xliff:g id="id">ime</xliff:g></item>
       <item><xliff:g id="id">sync_failing</xliff:g></item>
       <item><xliff:g id="id">sync_active</xliff:g></item>
       <item><xliff:g id="id">gps</xliff:g></item>
       <item><xliff:g id="id">bluetooth</xliff:g></item>
       <item><xliff:g id="id">nfc</xliff:g></item>
       <item><xliff:g id="id">tty</xliff:g></item>
       <item><xliff:g id="id">speakerphone</xliff:g></item>
       <item><xliff:g id="id">mute</xliff:g></item>
       <item><xliff:g id="id">volume</xliff:g></item>
       <item><xliff:g id="id">wifi</xliff:g></item>
       <item><xliff:g id="id">cdma_eri</xliff:g></item>
       <item><xliff:g id="id">data_connection</xliff:g></item>
       <item><xliff:g id="id">phone_evdo_signal</xliff:g></item>
       <item><xliff:g id="id">phone_signal</xliff:g></item>
       <item><xliff:g id="id">battery</xliff:g></item>
       <item><xliff:g id="id">alarm_clock</xliff:g></item>
       <item><xliff:g id="id">secure</xliff:g></item>
       <item><xliff:g id="id">clock</xliff:g></item>
    </string-array>
[/code]

각 id는 id자체를 의미하고, 순서가 곧 인덱스가 됩니다.
프레임워크상의 소스에서도 인덱스 번호를 직접 사용하진 않으니 순서만 보면 됩니다.

다음으로 화면에 그려주는 부분입니다.

클래스 com.android.systemui.statusbar.StatusBarPolicy 에서 처리가 됩니다.
실제 파일 위치는 frameworks/base/package/SystemUI/src/com/android/systemui/statusbar/StatusBarPolicy.java 입니다.

안드로이드 부팅시 StatusBar서비스가 올라오고, 이 클래스에서 아이콘을 등록하고, 시스템 notification들을 등록합니다.
시스템 noti시 아이콘이 변경되는 코드도 이곳에 있습니다.

아이콘을 등록하고 Notification콜백을 등록하는 부분은 StatusBarPolicy 의 생성자 부분에서 처리합니다.

배터리의 경우를 예로 들어보면,
[code java]
mService.setIcon("battery", com.android.internal.R.drawable.stat_sys_battery_unknown, 0);
[/code]
이런식으로 등록이 됩니다.

첫번째 인자는 xml 리소스상에 있는 슬롯의 id입니다. setIcon의 소스를 보면 이 id로 실제 슬롯의 인덱스를 받아옵니다.
두번째 인자는 표시할 아이콘의 drawable 리소스입니다.
세번째 인자는 변수명이 iconLevel이라고 되어 있는데, 실제 내부적으로는 사용되지 않는듯 하고, 값을 저장하는 용도로 사용이 가능할 것 같습니다. 실제적으론 모두 0을 넣고 있습니다.


아이콘이 등록이 되었으면, 상태가 변경되었을때 작업하기 위한 브로드캐스트 수신 역시 등록해야 하는데
이 부분은 아이콘 등록하는 부분 아래에 있습니다.
[code java]
        filter.addAction(Intent.ACTION_BATTERY_CHANGED);
        filter.addAction(Intent.ACTION_BATTERY_LOW);
        filter.addAction(Intent.ACTION_BATTERY_OKAY);
[/code]
Intent를 등록하여 브로드캐스트를 수신하도록 지정합니다.


StatusBarPolicy.java가 위치한 frameworks/base/core/java/android/app 디렉토리에
StatusBar에 관련한 클래스들이 있으니 이곳을 참조하시면 됩니다.
And