SharedPreferences 应用程序上下文 vs 活动上下文

61

我在我的应用程序中使用了几个SharedPreferences用于存储数据。

有一些首选项在许多活动中都被使用。

我知道SharedPreferences内部由一个Map支持,以便快速读取和写入到SD卡当设置被更改时。

如果一个sharedpreference被很多活动使用,我想知道哪种方法更好:

  1. 在每个活动中使用活动上下文实例化它。
  2. 在每个活动中实例化它,但使用应用程序上下文。
  3. 将其放入例如Application类中,并仅在那里实例化它,类似于单例。

如果我使用第1种解决方案,每个活动是否有一个sharedpreference对象?当活动被销毁时,sharedpreference的内部map是否会被销毁?

如果我使用第2种解决方案,尽管我在每个活动中调用getSharedPreferences,是否只有一个实例?并且内部映射是否在应用程序处于活动状态的情况下保持在内存中?

希望有人知道Android如何在内部处理这个问题。


我建议选择第三个选项,您可以从所有活动中访问它,而且只需进行一次读取。 - Joel
4个回答

87

值得回顾一下展示Context实例(无论是Activity还是Application实例)共享相同静态映射HashMap<String,SharedPreferencesImpl>源代码

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

因此,实际上无论您采用哪种方法,重要的是使用相同的名称,以便从应用程序的不同部分获取相同的偏好设置。但是,创建一个单一的“访问点”来管理偏好设置可能是一个优点。因此,可以在Application.onCreate()中实例化偏好设置的单例包装器。


25

SharedPreferences 是由 Android 内部作为单例管理的。您可以使用以下代码获取任意数量的实例:

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

11

我建议使用一个单例类来保存偏好设置,在应用程序上下文中初始化一次。创建getter和setter(get/put)方法以添加、更新和删除数据。

这样可以创建一个实例,使代码更易读、更易重用。


当应用程序从HTTP请求返回时,这也是很好的。在这种情况下,上下文(活动)可能不存在,因此context.getSharedPreferences会导致NPE。使用单例模式就不会发生这种情况。 - CoolMind

0
我们可以创建一个偏好设置单例类,并在扩展的应用程序类中使用applicationContext创建该类的实例,以便我们可以在整个应用程序中使用该对象。 我已经创建了一个sharedPreferenceManager类,并通过提供applicationContext创建了一个静态对象。现在,该静态对象可以在项目的任何地方访问。
public class App extends Application {
    public static App myApp;
    public static PreferenceManagerSignlton preferenceManagerSingleton;
    @Override
    public void onCreate() {
        super.onCreate();
        myApp = this;
        preferenceManagerSingleton = new PreferenceManagerSignlton();
        preferenceSingleton.initialize(getApplicationContext());
    }
}

访问项目中的静态对象

App.myapp.PreferenceManagerSignltonz.getSavedValue();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接