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

d1r*_*1rk 50 android android-context sharedpreferences

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

我知道SharedPreferences在内部由地图支持,用于快速读取访问,并在设置更改时写入SD卡.

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

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

如果我使用1.解决方案是否有每个活动的共享首选项对象?当活动被销毁时,共享首选项的内部地图是否会被销毁?

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

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

Vit*_*nko 71

这是值得检讨的来源是表明一个Context实例(无论是一个Activity或一个Application实例)共享同一个静态地图HashMap<String, SharedPreferencesImpl>.

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

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


Dav*_*ser 18

SharedPreferences由Android作为单身内部管理.您可以使用以下任意数量的实例:

context.getSharedPreferences(name, mode);
Run Code Online (Sandbox Code Playgroud)

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


AAn*_*kit 9

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

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