getDefaultSharedPreferences와 getSharedPreferences의 차이점


224

안드로이드 getDefaultSharedPreferences와 의 차이점은 무엇입니까 getSharedPreferences? 누구든지 설명해 주시겠습니까?


거의 너무 명백한 차이점은 하나는 정적이고 다른 하나는 그렇지 않다는 것입니다. 그러나 Context하나를 호출하려면 인스턴스가 필요하기 때문에 실제로 중요하지 않습니다 .
LarsH

답변:


224

getDefaultSharedPreferences"com.example.something_preferences"와 같은 기본 이름을 사용하지만 이름 getSharedPreferences필요 합니다.

getDefaultSharedPreferences실제로 사용 Context.getSharedPreferences(아래는 안드로이드 소스에서 직접 제공) :

public static SharedPreferences getDefaultSharedPreferences(Context context) {
    return context.getSharedPreferences(getDefaultSharedPreferencesName(context),
        getDefaultSharedPreferencesMode());
}

private static String getDefaultSharedPreferencesName(Context context) {
    return context.getPackageName() + "_preferences";
}

private static int getDefaultSharedPreferencesMode() {
    return Context.MODE_PRIVATE;
}

9
getDefaultSharedPreferencesName백업 / 복원 프레임 워크에 이름이 필요하므로 나쁜 것은 공개되지 않습니다.
Martin


그리고 getSharedPreferences 모드에서 환경 설정에 사용자 정의 이름을 사용하는 환경 설정 변경을 청취하는 방법 (getSharedPreferences "com.example.something_preferences"와 같은 기본 이름을 사용하지 않음)
Dr.jacky

소스에 링크를 추가해 주시겠습니까?
Mr_and_Mrs_D

@Mr_and_Mrs_D 쉽게 찾을 수 있습니다. 링크를 추가하면 특정 API 버전으로 연결되며 원하는 버전이 아닐 수도 있습니다.
copolii 2016

120

기본적인 차이점을 살펴 보겠습니다.

  1. getDefaultSharedPreferences()기본 환경 설정 파일 이름을 사용합니다. 이 기본값은 애플리케이션마다 설정되므로 동일한 앱 컨텍스트의 모든 활동이 다음 예제와 같이 쉽게 액세스 할 수 있습니다.

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }

    기본 설정은 일반적으로에 저장됩니다 /data/data/com.package.name/shared_prefs/com.package.name_preferences.xml.

  2. 대체 방법- getSharedPreferences(name,mode)특정 기본 설정 (파일) 이름 및 작업 모드 (예 : 개인, 세계 _ 판독 가능 등)를 표시해야합니다.

copolii에서 언급했듯이 결과는 동일하지만 첫 번째 옵션은 더 단순하고의 두 번째 옵션으로 제공되는 여러 기본 설정 파일로 분할 할 수있는 유연성이 부족합니다 getSharedPreferences(). MODE_WORLD_READABLE 작업 표시기를 사용하여 앱간에 환경 설정을 공유하는 것도 가능 getSharedPreferences()하지만 거의 사용되지 않습니다.

getDefaultSharedPreferences()앱의 다른 모듈이 다른 환경 설정 파일을 사용하지 않는 한 , IMHO 는 오타와 혼동되기 쉬운 여러 환경 설정 파일 이름을 혼동하지 않고 안전하게 사용할 수 있습니다. 일반적으로 이것은 필요하지 않습니다. 앱이 많은 매개 변수를 저장해야하는 경우 더 나은 데이터 보호 기능을 제공하므로 외부 데이터베이스를 사용하는 것이 좋습니다.

getDefaultSharedPreferences ()가 아닌 getSharedPreferences ()를 정기적으로 사용해야하는 합당한 이유를 알고있는 사람은 여기에 의견을 보내 주시기 바랍니다.



1
그리고 getSharedPreferences 모드에서 환경 설정에 사용자 정의 이름을 사용하는 환경 설정 변경을 청취하는 방법 (getSharedPreferences "com.example.something_preferences"와 같은 기본 이름을 사용하지 마십시오)
Dr.jacky

Dr.jacky 나는 당신이 어떤 종류의 세션과 같은 객체로 환경 설정을 마무리 할 것이라고 말하고 싶습니다 : class Session {prefs = getSharedPreferences () ...} 그리고 모니터링하려는 것들에 게터와 세터를 사용하십시오. setter가 호출되면 setter 논리에서 이벤트를 트리거 할 수 있습니다.
Alex Weavers 2014 년

2

나는이 게시물이 약간 오래되었다는 것을 알고 있지만 v7 지원 라이브러리의 24.0.1 이후로 어디서나 컨텍스트를 사용하여 기본 환경 설정을 검색 할 수 있습니다

// context might be an application context, activity, ..
// so if you want to get your apps defaults, pass an activity context
PreferenceManager.getDefaultSharedPreferences(context)

https://developer.android.com/reference/android/support/v7/preference/PreferenceManager#getdefaultsharedpreferences를 참조 하십시오.


PreferenceManager는 Android Q에서 더 이상 사용되지 않습니다. 여전히 context.getSharedPreferences 방식을 사용할 수 있습니다. 이 호출을 context.getSharedPreferences ( "$ {packageName} _preferences", MODE_PRIVATE)로 변경
Kevin

2
PreferenceManager가 Androix로 이동되어 더 이상 사용되지 않는 것 같습니다. developer.android.com/reference/androidx/preference/…
FutureShocked


1

getSharedPreferences () 및 getDefaultSharedPreferences ()는 모두 애플리케이션 레벨 환경 설정에 액세스하는 데 사용됩니다. getDefaultSharedPreferences ()는 Android의 전체 환경 설정 프레임 워크에 따라 작동하는 공유 환경 설정을 가져 오는 데 사용됩니다. getDefaultSharedPreferences ()는 기본적으로 PreferenceActivity와 함께 작동하는 SharedPreferences 객체를 제공하므로 사용하는 것이 좋습니다.


0

기본 공유 설정을 사용하는 경우가 있으니주의하시기 NOT 패키지 이름과 공유 기본 설정을 사용하는 것과 같습니다 :

context.getSharedPreferences(getPackageName(), MODE_PRIVATE);

=> 공유 환경 설정 이름 : " com.my.packagename "

PreferenceManager.getDefaultSharedPreferences(context);

=> 공유 환경 설정 이름 : " com.my.packagename_preferences "

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.