본문 바로가기

Android

안드로이드 SharedPreferences 사용법

안드로이드 앱이 종료되면 앱이 메모리에 가지고 있던 데이터는 사라지기 때문에 재실행시 필요한 데이터라면 여러 가지 방법으로 저장해 놓아야 합니다.


이 중 가장 쉬운 방법으로 SharedPreferences를 꼽을 수 있습니다. (공식싸이트 설명 바로가기)


Shared Preference는 단순히 디바이스의 내부에 xml 파일 형태로 key, value의 쌍의 값들을 저장해 놓는 방식입니다.

그래서 파일 이름으로 Shared Preference를 오픈 한 후 key를 가지고 값을 찾거나 value를 저장하도록 되어 있습니다.


아래는 파일 이름을 myFile로 하고 key는 keyword라고 가정해서 어떻게 사용하는 지를 정리한 그림입니다.



실제 파일 저장 위치는 앱이 설치된 단말의 /data/data/"PACKAGE_NAME"/shared_prefs/"PREFS_NAME".xml 입니다.

이 위치에 직접 접근하기 위해서는 루팅을 해야 하니 단말을 분실하지 않는한 어느 정도는 안전하다고 할 수 있으나,

만일의 경우를 대비하여 비밀번호와 같은 것은 저장하지 않거나 암호화를 해놓는 것이 좋을 듯 합니다.


참고로 디바이스의 설정 > 해당 앱에서 데이터 지우기를 하게 되면 Shared Preference도 모두 지워지게 됩니다.


이전 예제(http://zeany.net/14)를 바탕으로 사용자가 submit 버튼을 누르면 keyword를 저장하고, 이후 실행 시 해당 값이 있으면 그 값을 화면에 보여주는 예제의 소스입니다.


1) SharedPreferences를 위한 private 멤버 변수 생성 및 초기화


1
2
3
4
5
6
7
    private SharedPreferences sp;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        ...

        sp = getSharedPreferences("myFile", Activity.MODE_PRIVATE);


2) 웹뷰로부터 값을 읽어서 Shared Preference에 저장


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
        mWebView.addJavascriptInterface(new Object() {
            @JavascriptInterface
            public void justDoIt(String keyword) {
                Toast.makeText(MainActivity.this, "Keyword is " + keyword, Toast.LENGTH_LONG).show();

                SharedPreferences.Editor editor = sp.edit();

                editor.putString("keyword", keyword);

                editor.commit();
            }
        }, "Zeany");


3) Shared Preference로부터 값을 읽어서 웹뷰로 전달


 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
        mWebView.setWebViewClient(new WebViewClient() {
            ...

            @Override
            public void onPageFinished(WebView view, String url) {
                if (url.equals(ENTRY_URL)) {
                    String keyword = sp.getString("keyword", "");

                    String script = "javascript:function afterLoad() {"
                            + "document.getElementById('keyword').value = '" + keyword + "';"
                            + "document.forms[0].setAttribute('onsubmit', 'window.Zeany.justDoIt(elements[0].value); return true;');"
                            + "};"
                            + "afterLoad();";

                    view.loadUrl(script);
                }
            }
        });


앱을 실행한 후 keyword를 원하는 값으로 입력 후 submit을 누릅니다. 이어 앱을 종료한 뒤 다시 실행하면 이전에 입력한 값이 보이는 것을 확인할 수 있습니다.



※ 이 프로젝트는 https://github.com/zeany/webview 에 있으며 아래 명령으로 소스를 가져올 수 있습니다.

(이미 git clone 으로 프로젝트를 내려 받은 경우에는 프로젝트 홈 디렉토리에서 git checkout 만 하면 됩니다.)


git clone https://github.com/zeany/webview.git


cd webview

git checkout -f step-9