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

时间:2012-07-19 18:32:10

标签: android sharedpreferences android-context

我正在使用多个SharedPreferences在我的应用中存储数据。 许多活动都使用了一些偏好。

我知道SharedPreferences在内部由地图支持,以便进行快速读取访问,并在设置更改时写入SD卡。

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

  1. 使用活动上下文在每个活动中实例化它。
  2. 在每个活动中实例化它,但使用应用程序上下文。
  3. 把它放在例如Application类,只在那里实例化一次,类似于单例。
  4. 如果我使用1.解决方案是否每个活动都有一个共享首选项对象?当活动被销毁时,共享偏好的内部地图会被破坏吗?

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

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

3 个答案:

答案 0 :(得分:69)

值得一看sources,表明Context实例(无论是Activity还是Application实例)共享相同的静态地图{{1} }。

因此,每当您通过HashMap<String, SharedPreferencesImpl>以相同名称请求SharedPreferences的实例时,您将获得相同的实例,因为它首先检查地图是否已包含密钥的Context.getSharedPreferences(name, mode)实例(其中是传递的名字)。加载SharedPreferences实例后,将不会再次加载,而是从地图中加载。

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

答案 1 :(得分:16)

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

context.getSharedPreferences(name, mode);

只要您使用相同的名称,您就会始终获得相同的实例。因此没有并发问题。

答案 2 :(得分:9)

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

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

相关问题