【问题标题】:How to get SharedPreferences from non-Context class and without using non-final static variables?如何在不使用非最终静态变量的情况下从非上下文类获取 SharedPreferences?
【发布时间】:2012-11-12 13:03:56
【问题描述】:

我需要从一个名为 A 的抽象类中获取对共享首选项的引用,该类不扩展任何内容。

我无法将Context 对象传递给此类以获取共享首选项,因为它是抽象的,我不实例化它。我创建了类A 以由共享单个属性的其他POJO 扩展,即uuid。 UUID 在应用程序第一次运行时生成一次,这就是我将它存储在共享首选项中的原因。在A 类的构造函数中,我希望根据共享首选项中的内容设置uuid

public abstract class A {
    private String uuid;
    public A() {
        // this is how I'm hoping to use the shared preferences
        this.uuid = sharedPrefs.getString("KEY_UUID", "null");
    }
    // getter and setter
}

One suggestion I found 是对Application 的扩展,比如在一个名为App 的类中,并在清单的<application> 标记中包含一个属性android:name=".App"。我想App会这样写:

public class App extends Application {
    private static App app;
    public void onCreate() {
        this.app = this;
    }
    public static App getApp() {
        return app;
    }
}

...所以在课堂A 中,我可以这样做:

this.uuid = App.getApp().getSharedPreferences("prefs_name.txt", Context.MODE_PRIVATE).getString("KEY_UUID", "null");

但是,非最终静态字段app 是否会失去对App 的引用并在Android 终止进程或手机重新启动时变为空?如何在不使用此方法的情况下获得对共享首选项的引用?还是我应该手动将 UUID 写入文件?

【问题讨论】:

标签: java android sharedpreferences static-methods static-members


【解决方案1】:

将您的 App 类修改为如下内容:

public class App extends Application
{
    private static Context context;

    @Override
    public void onCreate()
    {
        super.onCreate();
        App.context = getApplicationContext();
    }

    public static Context getStaticContext()
    {
        return App.context;
    }
}

【讨论】:

  • 这不是和问题中的App代码一样吗?
【解决方案2】:

我无法将 Context 对象传递给此类以获取共享首选项,因为它是抽象的,我不实例化它。

当然可以。将Context 作为构造函数的参数。或者,如果您愿意,可以将SharedPreferences 作为构造函数的参数。您的子类的构造函数需要采用相同的参数并将其传递给 super() 调用。

但是,当Android终止进程或手机重启时,非最终静态字段app是否会丢失其对App的引用并变为null?

好吧,整个过程都过去了。说它失去了“它对应用程序的引用并变为空”类似于说一个处于核爆炸零地面的人会在被蒸发之前被晒伤 - 虽然可能是真的,但这一点有点没有实际意义。 :-)

【讨论】:

  • 我担心从实例化子 POJO 的活动和服务中传递 this 然后将其传递给 A 不是好的设计。但我想我别无选择。
  • @MattQuiros:那就不要通过this。通过SharedPreferences。或者,更好的是,传递实际的 UUID 字符串。或者,更好的是,如果这个 UUID 对于整个过程是唯一的(“UUID 在应用程序第一次运行时生成一次,这就是我将它存储在共享首选项中的原因”),把它放在一个静态数据成员中并跳过在每个 POJO 中加载它。
  • UUID 实际上是应用程序安装的唯一标识符,因此除非用户卸载并重新安装应用程序,否则不应再次生成它。所以我想我不能做你最后的建议,只是传递 UUID 而不是 thisSharedPreferences
  • @MattQuiros:“所以我想我不能做你最后的建议”——我的最后一个建议是将 UUID 缓存在静态数据成员中。你当然可以这样做。在开始创建 POJO 之前,只需从 SharedPreferences 初始化该静态数据成员。您必须已经在执行任何 POJO 之前的检查以在首次运行时创建该 UUID,因此此时只需将新的或现有的 UUID 存储在静态数据成员中。顺便说一句,请记住,对于 Android 4.2+ 上同一设备的不同用户,您的 UUID 会有所不同。
  • 感谢 4.2 的提醒,但是如果我将 UUID 存储在静态数据成员中,当进程被终止或手机重新启动时,它将恢复到原始状态。我刚才测试了它,将全局静态int初始化为-1,并在活动中增加了它的值。当我重新启动手机并再次启动应用程序时,int 的值又回到了-1。希望我理解正确?
猜你喜欢
  • 1970-01-01
  • 2014-12-25
  • 2019-03-17
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多