如何在Activity之外使用sharedPreferences?

17
我在这个非常简单的问题上卡了几个小时,无法通过谷歌找到合适的解决方法。
我试图在我的应用程序的模型层中使用SharedPreferences类。特别是当应用程序启动时(如果用户设置了自动登录),我想能够保存或获取用户名和相应的令牌。
是否有办法在这个问题上使用SharedPreferences,还是我只能使用FileInput/Output?
3个回答

31

您在哪里实例化Model类?

只需将上下文或SharedPreferences传递给构造函数:

public class Model {
    private final Context context;
    private final SharedPreferences sharedPrefs;

    public Model(Context context) {
        this.context = context;
        sharedPrefs = context.getSharedPreferences("name", 0);
    }

    private String doSomething(){
        return sharedPrefs.getString("key", "defValue");
    }
}

好的。但是如果我想从多个活动访问这些数据,这不会造成问题吗? - CodePrimate
如果您从多个活动访问数据,则需要使用新的构造函数,是吗?如果您希望在活动之间使用相同的SharedPreferences,那么它只取决于“名称”。 - Blundell
谢谢。这最终成为解决我的问题的关键。 - CodePrimate
在这里解释了http://www.freakyjolly.com/shared-preference-context-error-android/ - Code Spy

5

SharedPreferences 不仅可以从 Activity 中调用,还可以从 Context 中调用(Activity 继承了 Context),所以您也可以使用应用程序上下文。


我还开发了一个小的注入库,可以更轻松地使用偏好设置:https://github.com/ko5tik/andject。您只需将偏好设置注入/弹出到bean属性中即可。 - Konstantin Pribluda

0

您可以从任何持有上下文的代码中使用SharedPrederences。来自http://developer.android.com/reference/android/app/Activity.html的Activity文档:

使用getPreferences(int)方法管理Activity的持久状态,允许您检索和修改与Activity关联的一组名称/值对。要使用在多个应用程序组件(活动、接收器、服务、提供者)之间共享的首选项,可以使用底层的Context.getSharedPreferences()方法检索存储在特定名称下的首选项对象。(请注意,无法跨应用程序包共享设置数据--为此,您将需要内容提供程序。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接