안드로이드 홈 화면 상단은 기본적으로 세부분으로 이루어져 있습니다.
가장 왼쪽의 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 |