如何专门为使用SharedPreferences创建一个类?

时间:2010-10-26 13:48:38

标签: java android interface sharedpreferences

我的应用中有几项活动,我想利用共享偏好设置。最初,我在每个活动中创建了一个方法来使用SharedPreferences,它运行良好。但是,由于有多个活动使用相同的数据,我基本上在多个地方隐藏类似的方法。因此,为了处理所有这些方法而创建一个类似乎更有意义。

不幸的是,我不明白如何正确地做到这一点。

这不会编译,因为它说“对于AppPrefs类型,未定义getSharedPreferences。”

public class AppPrefs {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

最后,我想,也许因为SharedPreferences是一个接口,我可以做到这一点,但后来我必须实现继承的方法。我没有理由覆盖任何这些方法,所以也没有理由这样做。

public class AppPrefs implements SharedPreferences {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

这里有什么意义吗?我错过了一个概念吗?任何人都可以详细说明吗?感谢。

2 个答案:

答案 0 :(得分:1)

如果首选项是应用程序的全局,则可以在需要访问常用首选项时使用PreferenceManager.getDefaultSharedPreferences();。如果首选项特定于Activities的子集,则您有以下几种选择:

您可以创建一个由需要访问首选项的所有类扩展的Activity子类:

public abstract class AbstractFooActivity extends Activity
{
    protected SharedPreferences getFooPreferences()
    {
        return getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    }

    private static final String PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends AbstractFooActivity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getFooPreferences();
    }
}

或者,如果像我一样,你宁可不要乱用类层次结构,也可以简单地为需要访问首选项的活动组创建一个公共常量值。这在您具有需要访问首选项的Activity层次结构之外的类的情况下非常有用。例如,Service

public final class FooConstants
{
    public static final String FOO_PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends Activity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

public class AFooService extends Service
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

第二种方法的封装略少,但对对象层次结构的限制较少,这在我看来是一个很好的权衡。

答案 1 :(得分:1)

将您的上下文传递到您的偏好getter。

public class AppPrefs {
 public static void foo(Context ctx) {
  SharedPreferences settings = ctx.getSharedPreferences("MyAppPrefs", 0);
 } 
}

现在只需将this从活动类传递到foo()

即可