안드로이드 홈 화면 상단은 기본적으로 세부분으로 이루어져 있습니다.
가장 왼쪽의 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에 관련한 클래스들이 있으니 이곳을 참조하시면 됩니다.
가장 왼쪽의 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에 관련한 클래스들이 있으니 이곳을 참조하시면 됩니다.
'Knowledge > Android' 카테고리의 다른 글
Wifi-Direct 사용하기 (WifiP2pManager) (0) | 2013.06.25 |
---|---|
안드로이드 문자열 Localize를 위한 언어코드와 지역코드 (0) | 2012.07.12 |
ScrollView에서 내부 View변경시 스크롤이 이동되는 현상 (0) | 2012.06.24 |
안드로이드 Google Map api 이용하기 (0) | 2011.03.29 |
Android Framework Full-source 다운로드 및 빌드하기 (2) | 2011.03.08 |