What is a "Preference Activity" ? 

App. 등 설정에 관련된 UI 구성에 특화 되어 있는 Activity
설정 Item 구성 , Scrolling등을 지원합니다. 

Write XML Layouts

1. Activity Layout 


Class 관계를 살펴보면 PreferenceActivity는 ListActivity를 상속받는다. 
ListActivity에서 ListView를 접근할때,"@android:id/list"로 접근하기 때문에, Layout XML 작성시 유의 해야 한다. 

 <ListView android:id="@android:id/list"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:layout_weight="1"

        android:drawSelectorOnTop="false"/>


2. Preference Items 

addPreferenceFromResource() / addPreferenceFromIntent() 등을 통해 Preference Item을 삽입
나는 addPreferenceFromResource() 를 사용하는 것을 선호한다. 


위와 같이 Preference 관련 resource를 추가 한다. 

<PreferenceScreen

    xmlns:android="http://schemas.android.com/apk/res/android"

    android:title="@string/settings">


    <CheckBoxPreference

        android:key="alarm_in_silent_mode"

        android:title="@string/alarm_in_silent_mode_title"

        android:summary="@string/alarm_in_silent_mode_summary" />


    <VolumePreference

        android:title="@string/alarm_volume_title"

        android:summary="@string/alarm_volume_summary"

        android:dialogTitle="@string/alarm_volume_title"

        android:persistent="false"

        android:streamType="alarm" />


    <ListPreference

        android:key="snooze_duration"

        android:title="@string/snooze_duration_title"

        android:entries="@array/snooze_duration_entries"

        android:entryValues="@array/snooze_duration_values"

        android:defaultValue="10"

        android:dialogTitle="@string/snooze_duration_title" />


    <ListPreference

        android:key="volume_button_setting"

        android:title="@string/volume_button_setting_title"

        android:dialogTitle="@string/volume_button_dialog_title"

        android:entries="@array/volume_button_setting_entries"

        android:entryValues="@array/volume_button_setting_values"

        android:summary="@string/volume_button_setting_summary"

        android:defaultValue="2" />


</PreferenceScreen>


각각의 Entry는 View Entry등과 마찬가지로, Android Class와 Match 된다. 

Write your Code

1. 구현해야 할것들

다른 Activity 사용법과 마찬가지로, 만약 "Setting"화면이 필요하다고 하면,
"PreferenceActivity"를 상속받는 "SettingActivity"를 생성합니다. 

onCreate 
- addPreferenceFromResource를 통해 Preference Item을 구성
onPreferenceTreeClick
- PreferenceClick Event 처리
onPreferenceChanged
- Preference Value Change 처리

2. Source Code

 @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        addPreferencesFromResource(R.xml.settings);

    }



    @Override

    public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,

            Preference preference) {

        if (KEY_ALARM_IN_SILENT_MODE.equals(preference.getKey())) {

            CheckBoxPreference pref = (CheckBoxPreference) preference;

            int ringerModeStreamTypes = Settings.System.getInt(

                    getContentResolver(),

                    Settings.System.MODE_RINGER_STREAMS_AFFECTED, 0);


            if (pref.isChecked()) {

                ringerModeStreamTypes &= ~ALARM_STREAM_TYPE_BIT;

            } else {

                ringerModeStreamTypes |= ALARM_STREAM_TYPE_BIT;

            }


            Settings.System.putInt(getContentResolver(),

                    Settings.System.MODE_RINGER_STREAMS_AFFECTED,

                    ringerModeStreamTypes);


            return true;

        }


        return super.onPreferenceTreeClick(preferenceScreen, preference);

    }


    public boolean onPreferenceChange(Preference pref, Object newValue) {

        final ListPreference listPref = (ListPreference) pref;

        final int idx = listPref.findIndexOfValue((String) newValue);

        listPref.setSummary(listPref.getEntries()[idx]);

        return true;

    }


위의 코드는 실제로 addPreferenceFromResource를 통해서, Preference를 구성하고,
onPreferenceTreeClick을 이용하여, Preference Click 이벤트를 처리 하는 부분이다. 

이처럼 PreferenceActivity를 이용하면, 쉽게 Setting 화면을 구성할 수 있다. 


Android Manifest.xml은 Android 앱의 "시작과 끝"이다.
Android Manifest를 잘 들여 다 보면, 이 앱이 어떤 하드웨어를 사용하고, 어떤 기능등을 제공하는지 대략적으로 알 수 있다.

AndroidManifest.xml을 볼때 가장 먼저 보는것이 android-permission 부분이다.

DeskClock에서 사용하고 있는 Permission List는 아래와 같다 

    <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

    <uses-permissionandroid:name="android.permission.WAKE_LOCK"/>

    <uses-permissionandroid:name="android.permission.VIBRATE"/>

    <uses-permissionandroid:name="android.permission.WRITE_SETTINGS"/>

    <uses-permissionandroid:name="android.permission.DISABLE_KEYGUARD"/>

    <uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>

    <uses-permissionandroid:name="android.permission.DEVICE_POWER"/>


해당 설정들은 http://developer.android.com/reference/android/Manifest.permission.html 에서 상세 정보를 볼수 있따.

특히한것만 한번 살펴 보면,

WRITE_SETTING - Android Device의 System Setting을 Read/Write할 수 있는 권한  
DISABLE_KEYGUARD - KEYGUARD를 Disable시키는 건데, KeyGuard란 화면 Lock됐을때의 화면이다.
READ_PHONE_STATE - Phone 번호 정보등 폰에 관련된 정보를 얻기 위한 권한 

Activity 들은 UI 단의 Activity 이기 때문에, 제처두고, 

등록되어 있는 Service, Provider, Receiver쪽을 잠깐 살펴보자..

<provider android:name="AlarmProvider" android:authorities="com.android.deskclock" />


이부분은 해당 App.을 "Content Provider"로 사용하겠다는 선언이다.
android:authorities는 Content Provider의 identification 이라고 생각하면 된다.
자세한 정보는 에서 http://developer.android.com/guide/topics/manifest/provider-element.html 확인할 수 있다.


 <receiver android:name="AlarmReceiver">

            <intent-filter>

               <action android:name="com.android.deskclock.ALARM_ALERT" />

               <action android:name="alarm_killed" />

               <action android:name="cancel_snooze" />

            </intent-filter>

 </receiver>

 <service android:name="AlarmKlaxon">

            <intent-filter>

                <action android:name="com.android.deskclock.ALARM_ALERT" />

            </intent-filter>

 </service>


위와 같이 service/receiver 선언 부분이 몇가지 있는데, 
service 는 Android에서 얘기하는 "BroadCast" 를 발생시키는 녀석이고,
receiver는 "BroadCast"를 받아서 처리 하는 녀석이다.

위의 코드를 보면, DeskClock에서는 Alram을 발생시키고, 그리고 자기가 직접 처리 할수 있게 설정되어 있다.
그외에도 몇가지 Receiver들이 선언 되어 있는데,
BOOTING/TIME_SET/TIMEZONE_CHANGED/등등의 BROADCAST를 처리 할 수 있게 
Receiver들이 선언 되어 있다. 

단순한 것이지만, service를 등록하여 alram을 broadcast하고, receiver를 등록하여 alram을 사용자에게 알려주는 기능을 한다는 것을 
AndroidManifest.XML을 보면서 파악할 수 있었다.

이 Manifest 설정을 보면서 소스 코드를 파악해보도록 하자.


+ Recent posts