Android SharedReferences应用程序上下文与活动上下文

Android SharedReferences应用程序上下文与活动上下文,android,sharedpreferences,android-context,Android,Sharedpreferences,Android Context,我正在使用几个SharedReference在我的应用程序中存储数据。 许多活动中都使用了一些首选项 我知道SharedReferences内部有一个用于快速读取访问的映射,并在设置更改时写入SD卡 我想知道如果很多活动都可以访问SharedReference,那么哪种方式更好: 使用活动上下文在每个活动中实例化它 在每个活动中实例化它,但使用应用程序上下文 例如,将其放入应用程序类中,并在那里仅实例化一次,类似于单例 如果我用1。解决方案是否每个活动都有一个SharedReference对象?

我正在使用几个SharedReference在我的应用程序中存储数据。 许多活动中都使用了一些首选项

我知道SharedReferences内部有一个用于快速读取访问的映射,并在设置更改时写入SD卡

我想知道如果很多活动都可以访问SharedReference,那么哪种方式更好:

  • 使用活动上下文在每个活动中实例化它
  • 在每个活动中实例化它,但使用应用程序上下文
  • 例如,将其放入应用程序类中,并在那里仅实例化一次,类似于单例
  • 如果我用1。解决方案是否每个活动都有一个SharedReference对象?当活动被销毁时,SharedReference的内部映射会被销毁吗

    如果我用2。解决方案尽管我在每个活动中调用GetSharedReferences,但是否只有一个实例?只要应用程序处于活动状态,内部映射就会在内存中吗


    希望有人知道Android内部是如何处理的。

    我更喜欢使用单例类作为首选项,根据应用程序上下文初始化首选项一次。创建getter和setter(get/put)方法来添加、更新和删除数据


    通过这种方式,它将创建一次实例,并且更具可读性和可重用性。

    SharedReferences
    由Android作为单例进行内部管理。您可以使用以下方法获得任意数量的实例:

    context.getSharedPreferences(name, mode);
    
    只要使用相同的名称,就会得到相同的实例。因此不存在并发问题。

    值得一看的是,
    上下文
    实例(无论是
    活动
    还是
    应用程序
    实例)共享相同的静态映射

    因此,每当您通过
    Context.getSharedReferences(name,mode)
    以相同的名称请求
    SharedReferences
    的实例时,您都会得到相同的实例,因为它首先检查映射是否已经包含键(即传递的名称)的
    SharedReferences
    实例。一旦加载了
    SharedReferences
    实例,它将不会再次加载,而是从映射中获取


    因此,无论您选择哪种方式,重要的是使用相同的名称,以便从应用程序的不同部分获得相同的pref。不过,为PREF创建一个“接入点”可能是一个优势。因此,它可以是在
    Application.onCreate()

    中实例化的prefs上的单例包装器。我建议选择三,您可以从所有活动访问,只需执行一次读取。当应用程序从HTTP请求返回时,这也很好。在这种情况下,上下文(活动)可能不存在,因此context.getSharedReferences将导致NPE。当使用单例时,这不会发生。