58

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

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

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

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

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

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

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

4

4 回答 4

83

值得查看显示实例(无论是一个实例还是一个实例)共享相同静态地图的来源ContextActivityApplicationHashMap<String, SharedPreferencesImpl>

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

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

于 2012-07-19T19:20:21.943 回答
22

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

context.getSharedPreferences(name, mode);

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

于 2012-07-19T19:05:57.873 回答
10

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

这样,它将创建一次实例,并且更具可读性和可重用性。

于 2012-07-19T18:39:17.987 回答
0

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

于 2022-01-12T17:06:32.807 回答