Android GetDefaultSharedReferences和GetSharedReferences之间的差异

Android GetDefaultSharedReferences和GetSharedReferences之间的差异,android,android-preferences,sharedpreferences,Android,Android Preferences,Sharedpreferences,Android中的GetDefaultSharedReferences和GetSharedReferences之间有什么区别?有人能解释一下吗?GetDefaultSharedReferences将使用默认名称,如“com.example.something\u preferences”,但GetSharedReferences将需要一个名称 getDefaultSharedReferences实际上使用的是上下文。getSharedReferences(下面直接来自Android源代码): 让

Android中的
GetDefaultSharedReferences
GetSharedReferences
之间有什么区别?有人能解释一下吗?

GetDefaultSharedReferences
将使用默认名称,如“com.example.something\u preferences”,但
GetSharedReferences
将需要一个名称


getDefaultSharedReferences
实际上使用的是
上下文。getSharedReferences
(下面直接来自Android源代码):


让我们回顾一下差异的基本点:


  • getDefaultSharedReferences()
    使用默认首选项文件名。此默认值是按应用程序设置的,因此同一应用程序上下文中的所有活动都可以轻松访问它,如以下示例所示:

    SharedPreferences spref = PreferenceManager.getDefaultSharedPreferences(this);
    if (spref.contains("email")) {
         String sEmailAddr = spref.getString("email", "");
    }
    
    首选项通常存储在
    /data/data/com.package.name/shared\u prefs/com.package.name\u preferences.xml

  • 另一种方法-
    getSharedReferences(名称、模式)
    要求指示特定的首选项(文件)名称和操作模式(例如私有、世界可读等)

  • 正如copolii所提到的,结果是一样的,但是第一个选项更简单,并且缺乏拆分为多个首选项文件的灵活性,这是由第二个选项
    getSharedReferences()
    提供的。 使用模式世界可读的操作指示器在应用程序之间共享首选项也可以使用
    getSharedReferences()
    ,但很少使用

    总之,
    getDefaultSharedReferences()
    可以安全地使用,而不会混淆多个易于拼写和混淆的首选项文件名,除非您希望应用程序中的不同模块使用不同的首选项文件。通常这是不需要的。如果应用程序需要保存大量参数,那么使用外部数据库可能会更好,因为它还提供更好的数据保护


    如果有人知道经常使用GetSharedReferences()而不是GetDefaultSharedReferences()的好理由,请在这里发表评论让我知道。

    还有第三个函数:

    public SharedPreferences Activity.getPreferences(int mode) {}
    

    请参见我的问题和答案:

    GetSharedReferences()和GetDefaultSharedReferences()都用于访问应用程序级首选项。GetDefaultSharedReferences()用于获取根据Android总体首选项框架工作的共享首选项。GetDefaultSharedReferences()更适合使用,因为它提供了默认情况下与PreferenceActivity一起工作的SharedReferences对象。

    我知道这篇文章有点老了,但是由于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)
    

    请参见

    请注意,使用默认共享首选项与在包名中使用共享首选项不同:

    context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
    
    =>共享首选项的名称:com.my.packagename


    =>共享首选项的名称:“com.my.packagename\u首选项”

    至坏
    GetDefaultSharedReferenceName
    不是公共的,因为备份/还原框架需要该名称。如何?以及如何在使用自定义名称作为首选项的GetSharedReferences模式下侦听首选项更改?(不要使用默认名称,如GetSharedReferences“com.example.something_preferences”)您可以添加指向源的链接吗?@Mr_and_Mrs_D更容易查找。如果我添加一个链接,它将指向一个特定的API版本,这可能是您想要的,也可能不是您想要的。我的理由是:在使用自定义名称作为首选项的GetSharedReferences模式下,如何侦听首选项更改?(不要使用默认名称,如GetSharedReferences“com.example.something_preferences”)jacky博士,我想说的是,您应该将您的首选项封装在某种会话中,比如object:class Session{prefs=GetSharedReferences()…},然后使用getter和setter来监视您想要监视的内容。调用setter时,可以在setter逻辑中触发事件。一个几乎太明显的区别是一个是静态的,另一个不是。但这其实并不重要,因为您需要一个
    上下文
    实例来调用其中一个。这是活动源代码中getSharedReferences()的包装器:public sharedReferences getPreferences(int模式){return getSharedReferences(getLocalClassName(),mode);}Android Q中的PreferenceManager已被弃用。不过,您仍然可以使用context.getSharedPreferences。将此调用更改为context.getSharedReferences(${packageName}\u preferences),MODE\u PRIVATE)PreferenceManager似乎已被弃用,因为它刚刚被移动到Androix。
    context.getSharedPreferences(getPackageName(), MODE_PRIVATE);
    
    PreferenceManager.getDefaultSharedPreferences(context);