마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Activity를 상속받지 않은 클래스에서 쉐어드 프리퍼런스로 데이터 저장을 하고 싶을 때는 어떻게 해야하나요?

+1 추천
제가 아직 데이터베이스는 사용할 줄 몰라서

쉐어드 프리퍼런스를 사용하고있는데요,

 

메인액티비티가 있고 메인액티비티에 있는 쉐어드 프리퍼런스를

(액티비티를 상속받지 않은) 타 클래스에서 사용하여 데이터 저장을 하고 싶습니다.

방법이 있을까요?
nandroid (1,620 포인트) 님이 2015년 8월 19일 질문

1개의 답변

+1 추천
 
채택된 답변

방법은 여러가지가 있습니다만..

Shared Preference 자체에 관련한 각종 read / write 함수들을 구현한 클래스를 별도로 만들어서 static함수로 가져다 쓰는 편이 가장 편합니다.

단, 해당 read/write를 수행하는 static 함수들을 사용할때 첫부분에 공통 initialize하는 함수를 타도록 합니다.

 

//클래스 변수
static SharedPreferences pref; 

//공통 init 함수
init(Context context) {

 PreferenceManager.getDefaultSharedPreferences(context);

}
 

read(Context ctx) {

init(ctx);

//read동작

}



와 같이 말이죠..

어렵지 않습니다-

 

이때 가져다 쓰는 곳이 액티비티가 아닌데 Context는 어찌 매개변수로 넘기나요? 라고 혹시 의문이 드신다면

Application을 상속받은 최상위 실행 클래스를 어플에 구현하시면 됩니다.

보통 Manifest에 Main액티비티이전에 더 먼저 실행하게 하는 .java를 정의할 수 있습니다. 이 .java 클래스는 액티비티를 상속

하지 않은 녀석이죠.. 거기서 static 변수로 Context를 공통으로 하나 만들어 놓고 Non Activity클래스에서 Context를 가져다

쓰면 됩니다~

익명사용자 님이 2015년 8월 19일 답변
nandroid님이 2015년 8월 19일 채택됨
와... 정말 자세한 설명 감사드립니다!!!
void intDataSave(String key, int iValue) {
    // int형 데이터를 저장할 때 사용한다.
    gameDataSPE.putInt(key, iValue);
    gameDataSPE.commit();
}


((MainActivity) MainContext).intDataSave("key", 0);

===========================

제가 쓰는 게임엔진 예제에 있던걸 살짝 바꿨는데
이런식으로 구현하면 느려진다던가하는 문제가 있을까요?
느낌상 느려지는 듯 한게 조금 있는것같아서요 ㅠㅠ

MainContext는 MainActivity의 Context입니다.
메서드에서 commit(); 을 빼고 다 저장한 뒤에 한번만 commit 하니 지연시간이 많이 줄었네요.
...