[안드로이드] Preference - UI정보, 간단한 변수 저장하기

2010.04.24 15:12

   

   

<목표> 

 

[안드로이드] Preference – UI 정보, 간단한 변수 저장하기

 

 

 이번에는 Preference에 대해 다루어 보겠습니다. Preference(이하 프리퍼런스)는 화면 이동 시 간에 발생하는 데이터 손실을 방지하기 위해 사용되는 자료형입니다. 간단한 예로 들자면, 친구에게 메시지를 보내기 위해 열심히 문자를 쓰고 있는 와중에, 전화와 온다고 가정합시다. 전화를 받고 나서 긴 장문의 메시지가 날라간다면 어떤 느낌이 들까요? 이런 일을 방지하기 위해서 프리퍼런스라는 자료형을 사용합니다. 화면 전환 시, UI 정보를 저장하고, 다시 그 화면으로 돌아왔을 때의 UI 정보를 불러와서 다시 화면에 뿌려주는 역할을 합니다. 이 밖에도 화면 전환 시에 저장하고 싶은 데이터를 저장할 수도 있습니다. 즉 간단하게 말하면, 임시 저장소라고 생각하시면 될 것 같습니다.

   

  [핵심 코드] Preference 

 

  엑티비티 변환 시 데이터를 저장합니다.

SharedPreferences prefs = getSharedPreferences("PrefName", MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(KEY_MY_PREFERENCE, text);
editor.commit();

  엑티비티를 다시 실행하였을 때, 데이터를 불러옵니다.

SharedPreferences prefs = getSharedPreferences("PrefName", MODE_PRIVATE);
String text = prefs.getString(KEY_MY_PREFERENCE, "");

   

 아래의 예제에서는 간단하게 두 엑티비티 간의 화면이 바뀌었다가 다시 돌아왔을 때 제대로 프리퍼런스가 동작이 되고 있는지 확인합니다.

     

   

  STEP 1 자바 소스 코드 

 

  자바 코드는 두 가지를 다루게 됩니다. 첫 엑티비티는 시작화면으로, 간단히 데이터를 입력하고 화면을 전환시킵니다. 두 번째 엑티비티는 별다른 기능없이 다시 첫번째 엑티비티로 돌아가는 역할만 수행합니다.

   

  [Activity] Preference 를 이용한 첫 번째 엑티비티
package com.pulsewings.preferenceexample;
 
import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
 
public class PreferenceTestActivity extends Activity {
 
    public static final String KEY_MY_PREFERENCE = "my_preference";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        Button bt = (Button) findViewById(R.id.nextButton);
        bt.setOnClickListener(new View.OnClickListener() {
 
            @Override
            publicvoid onClick(View v) {
                Intent intent =    new Intent(PreferenceTestActivity.this, NextActivity.class);
                startActivity(intent);
            }
 
        });
 
        SharedPreferences prefs = getSharedPreferences("PrefName", MODE_PRIVATE);
        String text = prefs.getString(KEY_MY_PREFERENCE, "");
 
        // 첫번째 인자는 키, 두번째 인자는 키에 대한 데이터가 존재하지 않을 경우의 디폴트값
        final EditText edit = (EditText) findViewById(R.id.text);
        edit.setText(text);
    }
 
    // onStop() : 더이상 엑티비티가 사용자에게 보여지지 않을 때 불립니다.
    // 기존에 존재하는 데이터를 저장합니다.
 
    protected void onStop() {
        super.onStop();
        EditText editText = (EditText) findViewById(R.id.text);
        String text = editText.getText().toString();
 
        // 데이타를저장합니다.
        SharedPreferences prefs = getSharedPreferences("PrefName", MODE_PRIVATE);
        SharedPreferences.Editor editor = prefs.edit();
        editor.putString(KEY_MY_PREFERENCE, text);
        editor.commit();
 
    }
 
}

   

     

  [Activity ①] SharedPreferences 이용하여 데이터 저장하기

   

 첫 번째 엑티비티로 화면에서 간단한 UI를 조작하고 있습니다. 버튼을 클릭하면 Intent를 이용하여 다음 엑티비티로 전환합니다. 화면을 전환하게 되면 onStop()이 호출이 되게 되며, 이 상태에서 저희가 사용할 프리퍼런스를 이용해서 데이터를 저장해야합니다. 위의 코드에서 보는 것처럼 SharedPreFerences라는 데이터 유형을 사용해야 합니다. 안드로이드 자체에서 제공해주는 자료형으로써, getSharedPreferences( Key값, Permission값 ) 메서드를 호출하여 자료형의 속성을 지정할 수 있습니다.

 "PrefName" 은 말그대로 자신이 정하고 싶은 Key 값이라고 보시면 됩니다. 다음에 데이터를 호출할 때 이 Key 값을 이용하여 그 자료형을 불러올 수 있습니다. 다음 인자는 이 자료형에 대한 권한 설정을 해주는 부분입니다. MODE_PRIVATE, MODE_WORLD_READABLE, MODE_WORLD_WRITEABLE 을 이용하여 이 파일에 대한 접근 권한을 설정합니다.

MODE_PRIVATE -rw-rw----
MODE_WORLD_READABLE -rw-rw-r--
MODE_WORLD_WRITEABLE -rw-rw--w-

 위에서 보시는 것과 같이 이 데이터에 대한 권한을 설정할 수 있습니다. 리눅스 개발을 한번이라도 접해신분들이라면 곧바로 이해가 되실 겁니다. 이렇게 저장된 프리퍼런스는 xml 형태로 저장이 됩니다. (소스 내에 존재하진 않습니다.) 패키지 파일 내에 있는 shared_prefs 영역에 선언된 SharedPreferences 자료가 저장되어 있는 것을 확인하실 수 있습니다.

이렇게 저장된 프리퍼런스를 이용하여 Editor라는 자료형으로 선언합니다. 말 그대도 편집하기 위해서 선언을 한 뒤에, 자신이 저장하고 싶은 데이터 이름을 설정해주고, 저장하고 싶은 변수를 넣으면 저장이 됩니다. 그리고 마지막으로 commit()을 호출하면 데이터가 저장됩니다.

   

  [Activity ②] SharedPreferences 이용하여 데이터 불러오기

 

 이제 저장한 데이터를 이용하여 불러와야 합니다. 불러오는 부분은 엑티비티가 생성 시, 즉 onCreate( ) 부분에 넣으면 됩니다. SharedPreferences를 설정해주고, 미리 정해둔 Key 값을 넣어 데이터를 불러오면 됩니다. 아주 간단하게 작업이 이루어집니다.

  엑티비티의 라이프 사이클을 고려하여, 해당하는 부분에 알맞도록 프리퍼런스가 동작하도록 설정해주면, 입맛에 맞게 이용할 수 있습니다.

   

   

  [Activity] 단순히 뒤로갈 수 있게 만드는 두 번째 화면 엑티비티

   

 두 번째 화면 엑티비티는 테스트를 위해 필요한 부분입니다. 단순히 다시 화면으로 돌아갔을 때 원래의 값이 남아 있는지 확인 하는 부분입니다. 엑티비티를 생성하시고 간단히 뒤로 가는 버튼을 넣어주면 됩니다. 별다른 어려운 점이 없는 부분이니 넘어가겠습니다.

   

class NextActivity extends Activity {
 
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.next);
 
        Button bt = (Button) findViewById(R.id.previousButton);
        bt.setOnClickListener(new View.OnClickListener() {
 
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(NextActivity.this, PreferenceTestActivity.class);
                startActivity(intent);
            }
 
        });
    }
 
}

    

     

  STEP 2 Xml 코드 

     

 첫 번째 엑티비티는 텍스트뷰와 에디트박스, 버튼으로 구성되어 있습니다. 에디트박스에 있는 데이터가 저장되고 다시 돌아왔을 때 저장되었는지를 확인합니다. 제대로 저장이 되어 있다면, 쓰고 있던 메시지가 그대로 저장이 되어야 합니다.

   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="첫엑티비티" />
 
    <EditText
        android:id="@+id/text"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />
 
    <Button
        android:id="@+id/nextButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="다음으로" >
    </Button>
 
</LinearLayout>

   

 두 번 째 엑티비티는 첫 번째 엑티비티를 이용하여 돌아가기 위해 버튼만 구현해 놓았습니다.

   

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
 
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="다음 엑티비티" />
 
    <Button
        android:id="@+id/previousButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="이전으로" />
 
</LinearLayout>

   

   

  STEP 3 AndroidManifest.xml 코드 

 

 메니페스트에는 다음 엑티비티를 허용하겠다는 퍼미션만 추가하면 됩니다.

<?xml version="1.0" encoding="utf-8"?>
    package="example.preference"
    android:versionCode="1"
    android:versionName="1.0" >
 
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name" >
 
        <activity
            android:name=".PreferenceTestActivity"
            android:label="@string/app_name" >
 
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
 
        <activity android:name=".NextActivity" > </activity>
    </application>
 
</manifest>

 

 

 

<마무리> 

 

Preference 를 이용하여 간단한 데이터 저장하기

   

   

 화면 이동 시 일어날 수 있는 데이터 손실을 미리 방지하기 위해 프리퍼런스를 사용합니다. 이러한 간단한 정보를 데이터베이스를 이용하여 접근하는 것은 속도와 효율적인 면에서 큰 손실이 아닐 수 없습니다. 그렇기 때문에 안드로이드에서 제공해주는 SharedPreferencs라는 데이터 유형으로 프로그래밍 내에서의 변수 선언처럼 간단히 데이터를 저장하고 불러 올 수 있습니다. 엑티비티의 각각의 라이프 사이클에 맞게 데이터를 저장, 불러오기를 한다면 조금 더 사용성에 이점이 있도록 어플리케이션을 개발할 수 있습니다.

     

 

 

 

[ 참고자료 ]

   

   


Posted by 
맥박맥박의 개발 일지

 

  • 2013년 7월 25일 업데이트하였습니다.

 

 

맥박 안드로이드 , , ,

  1. Blog Icon
    asd

    실행은 안되는 코드네요

    오타도 너무많고

    당췌;;

  2. 어디가 안되는지 말씀해주시면 해당 내용을 고치겠습니다.
    실행을 해보고 올리는 자료라 잘 될것이라 생각합니다만...
    오타는 수정하겠습니다 ^^;;

    즐거운 하루 되세요~!

  3. Blog Icon
    jamesJoo

    정리를 너무 잘 하셨네요 :) 감사합니다 많은 도움이 되었어요!

  4. Blog Icon
    kkks

    정리를 정말 잘하셨네요!
    그런데, 보는사람 입장에서 xml부터 정리해주시면
    보고 따라하기가 좀 편하지 않을까요^^?

    무작전 java부터 손보면 에러표시가 나서 보기안좋으니..

    뭐 아무튼 정말 많은도움이 되었습니다^^

  5. Blog Icon
    ddding

    정리 잘 되어있네요. 필요한 정보 잘 건져갑니다.

  6. 좋으면 좋고 싫으면 싫은 거지, 뭐가 이렇게 어렵고 복잡하냐구

  7. Blog Icon
    blade

    ;; 이정도면 센스있게 알아서

    드셔야죠?

    초보개발자라고 해도 어느정도 맥을

    집어가면서 이해할 수 있을텐데..

    지금 제공자에게 숟가락에 밥퍼서

    떠먹여달라는거나 마찬가지 행동을 하시네요.

    잘보고 갑니다.

  8. Blog Icon
    질문

    안녕하세요 잘보았습니다~
    궁금한게 어플리케이션을 종료했다가 다시 열어도 프리퍼런스 정보가 저장되어있나요 ?

  9. Blog Icon
    ㅇㅇㅇ

    무개념 정말많네 하나부터 열까지 다알려줘야하나 자기가 필요한거 적절히 응용해서 해야지; 참 안타깝다

  10. Blog Icon
    ㅇㅅㅇ

    프리퍼런스는 액티비티 에서만 저장가능한가요?

  11. Blog Icon

    비밀댓글입니다