안드로이드의 설정(Settings)

안드로이드는 단말에서 사용하는 설정(setting)에 관련된 정보를 Settings과 Settings 안의 클래스들을 통해 제공한다. 하지만, 안드로이드 셋팅 앱(com.android.settings)이나 시스템 앱이 아니라면 이 값을 참조하지 않거나 한 두개 정도 참조할 것이다.

Settings 클래스

Settings 클래스는 설정의 하부에 포함된 메뉴로 진입할 수 있는 액션(Action)을 상수로 선언하고 있다.  이 상수를 이용하면 접근성 메뉴, 계정 메뉴, 블루투스 설정, 네트워크 설정 등의 액티비티를 바로 호출할 수 있다.

아래 코드는 ‘설정 > 연결 > Wi-Fi'(N OS 기준)로 바로 진입할 수 있다.

startActivity( new Intent( Settings.ACTION_WIFI_SETTINGS ));

모든 메뉴들을 위한 액션들이 있는 것은 아니다. 예를 들면, Wi-Fi 설정이나 모바일 네트워크 설정으로 바로가는 액션은 있지만, 이 메뉴들의 진입점인 ‘설정 > 연결’ 액티비티를 호출하는 액션은 없다.

Settings의 내부 클래스

Settings 클래스에는 Global, Secure, System 등의 내부 클래스가 있다. 이 들은 단말의 설정 값들을 제공한다. Global 클래스는 사용자 계정(주인, 손님)에 관계 없이 적용되는 설정을, Secure는 시스템 보안관련 설정을 System은 그 밖의 나머지 설정 값을 제공한다. ContentResolver 객체와 함께 건네면 값을 반환해주는 get 메소드를 제공한다. 각 값의 타입은 안드로이드 API doc를 통해 확인할 수 있다.

String dataFormat = Settings.System.getString( getContentResolver(), System.TIME_12_24 );

위 예제는 단말의 시계 표기 방식을 리턴한다. 값이 없는 설정의 경우 스트링은 null을 리턴하고, 숫자를 반환하는 메소드는 기본 값을 설정할 수도 있다.

하지만, 설정에 따라 저장하고 있는 클래스가 다른데다 설정이 다른 클래스로 이동하기도 하기 때문에 사용자가 어떤 클래스에서 설정을 찾아야할 지 혼란스럽다. 그래서 System에서 설정을 읽어오려 했는데 그 설정이 Global나 Secure로 이동했다면, 값의 저장 위치가 변경되었다는 경고(warning) 로그 메시지를 출력한 후 변경된 클래스에서 값을 찾아 반환한다.

모든 설정 클래스들이 put 메소드들을 제공하지만, 설정의 종류의 따라 다르게 동작한다. Global과 Secure는 설정의 메뉴나 특정 API를 통해서는 수정할 수 있지만 어플리케이션은 읽을 수만 있다. System은 기본적으로 읽을 수 있고, 일부 쓸 수도 있다. get 메소드와 마찬가지로 권한이 없다면 경고(warning) 로그 메시지를 출력한다.

특정 설정 값이 변경되는지 옵저버(observer)를 달 수도 있다.  ContentResolver.registerContentObserver() 메소드를 통해 ContentObserver를 달면 된다. 위에서 확인해본, 날짜 표기 방법이 바뀌는지 옵저버를 달아보자.

...
getContentResolver().registerContentObserver(
        Settings.System.getUriFor( System.TIME_12_24 ),
        false,
        new ContentObserver( new Handler() )
        {
            @Override
            public void onChange( boolean selfChange )
            {
                onChange( selfChange, null );
            }

            @Override
            public void onChange( boolean selfChange, Uri uri )
            {
                String str = Settings.System.getString(
                        getContentResolver(),
                        System.TIME_12_24 );

                Toast.makeText( MainActivity.this,
                                "setting= " + str,
                                Toast.LENGTH_SHORT )
                     .show();
            }
        } );
...

이제, 시간 표기 법이 변경되면 ContentObserver.onChange() 메소드들이 호출된다.

주의할 점은, onChange( boolean, Uri) 메소드는 API16부터 추가되었기 때문에 그 이전 OS를 지원하려면 onChange( boolean)을 구현해야 한다. 사용한 ContentObserver는 꼭 ContentResolver.unregisterContentObserver()를 통해 해제해주어야 한다. 해제하지 않으면 메모리 릭을 유발할 수 있다.

참고

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

이 사이트는 스팸을 줄이는 아키스밋을 사용합니다. 댓글이 어떻게 처리되는지 알아보십시오.