在每个活动中使用共享首选项

Posted

技术标签:

【中文标题】在每个活动中使用共享首选项【英文标题】:Using Shared Preferences in every activity 【发布时间】:2013-09-08 11:20:49 【问题描述】:

我希望在每个活动中都能访问我的应用程序首选项。我不想在每个活动中都获得所有 SharedPreferences。而是获取一次 SharedPreferences,并拥有一个全局对象,该对象具有所有这些首选项的值,例如 if (AppSettings.isSoundOn()) // do stuff,并且该对象随处可用,没有 if 和 buts。

我尝试使用静态类,但您无法从静态类获取共享首选项。此外,您获得 SharedPreferences 的类似乎必须扩展 Activity,否则会产生错误。

我确信通常有一种非常简单的方法可以做到这一点,因为它是基本的应用程序功能,但我所拥有的 android 开发书籍实际上都没有涵盖如何处理应用程序范围的偏好,以及我能找到的任何教程只介绍设置和获取 SharedPreferences,这很简单,但您必须在每个活动中都这样做。

【问题讨论】:

扩展Application 类。 ***.com/questions/4051875/… 【参考方案1】:

创建一个类似MyApplication 的类并从android.app.Application 扩展。 在那里您可以访问共享首选项。

在每个活动中,您都可以使用MyApplication app = (MyApplication)this.getApplication(); 获得Application

在 MyApplication 中放置一个获取 Sharedpreference 和存储它的公共方法。

【讨论】:

好的,这行得通,但是MyApplication app = (MyApplication)this.getApplication(); 是做什么的? (特别是(MyApplication)this.getApplication() 部分。另外,这是否意味着每次我想访问设置时,MyApplication 类的onCreate() 都必须运行并执行它所做的任何事情(在这种情况下从 SharedPreferences 读取) ? 仅仅得到几个布尔值不是很浪费吗? 不,MyApplication 的 onCreate() 只运行一次,当应用程序第一次启动时,直到它被销毁(用户从最近的应用程序中删除它,在应用程序设置中停止它,或者系统停止它,因为它需要内存)。 getApplication() 始终为您提供应用程序的应用程序类。您必须将其转换为 MyApplication 才能使用您放入其中的方法

以上是关于在每个活动中使用共享首选项的主要内容,如果未能解决你的问题,请参考以下文章

使用服务中的地理位置更新活动时的时序问题(使用共享首选项将地理位置从服务传输到活动)

将Bundle对象保存到共享首选项中[重复]

即使在应用关闭时,共享首选项也会永久传递给另一个活动

活动关闭时共享首选项空指针异常[重复]

使用 parcelable 将项目存储为共享首选项?

未在服务中获取共享首选项的更新值