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

Posted

技术标签:

【中文标题】SharedPreferences 应用程序上下文与活动上下文【英文标题】:SharedPreferences application context vs activity context 【发布时间】:2012-07-19 00:13:11 【问题描述】:

我正在使用多个 SharedPreferences 在我的应用程序中存储数据。 一些偏好用于很多活动。

我知道 SharedPreferences 在内部由映射支持以实现快速读取访问,并在设置更改时写入 sdcard。

我想知道如果许多活动都访问共享首选项,哪种方式更好:

    使用活动上下文在每个活动中实例化它。 在每个活动中实例化它,但使用应用程序上下文。 将其放入例如Application 类,并且只在其中实例化一次,类似于单例。

如果我使用 1. 解决方案,是否每个活动都有一个 sharedpreference 对象?当activity被销毁时,sharedpreference的内部映射会被销毁吗?

如果我使用 2. 解决方案,尽管我在每个活动中调用 getSharedPreferences,但是否只有一个实例?只要应用程序还活着,内部映射是否会在内存中?

希望有人知道 android 内部如何处理它。

【问题讨论】:

我推荐选择三,你可以从你所有的活动中访问,你只需要读一次。 【参考方案1】:

值得回顾一下sources,它表明Context 实例(无论是Activity 还是Application 实例)共享同一个静态映射HashMap<String, SharedPreferencesImpl>

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

所以实际上你走哪条路并不重要,重要的是使用相同的名称以便从应用程序的不同部分获得相同的首选项。但是,为首选项创建一个“访问点”可能是一个加号。所以它可能是Application.onCreate() 中实例化的首选项的单例包装器。

【讨论】:

【参考方案2】:

SharedPreferences 在 Android 内部作为单例进行管理。您可以使用任意数量的实例:

context.getSharedPreferences(name, mode);

只要您使用相同的名称,您将始终获得相同的实例。因此不存在并发问题。

【讨论】:

【参考方案3】:

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

这样它会创建一次实例,并且可读性更强,可重用。

【讨论】:

当应用程序从 HTTP 请求返回时也很好。在这种情况下,上下文(活动)可能不存在,因此 context.getSharedPreferences 将导致 NPE。使用单例时不会发生这种情况。【参考方案4】:

我们可以创建一个 Preferences Singleton Class 并在扩展 Application 类中使用 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();

【讨论】:

以上是关于SharedPreferences 应用程序上下文与活动上下文的主要内容,如果未能解决你的问题,请参考以下文章

使用集合调用构造函数类并从 asyncTask 获取 sharedpreferences(无法传递上下文)

使用 SharedPreferences 在 ListView 中保存 ToggleButton 状态

SharedPreferences(共享参数)

SharedPreferences-静态类中的静态字符串?

关于SharedPreferences写入和删除数组数据

MarkAndroid应用开发SharedPreferences存储数据的使用方法