Java 如何在不使用非最终静态变量的情况下从非上下文类获取SharedReference?
我需要从名为Java 如何在不使用非最终静态变量的情况下从非上下文类获取SharedReference?,java,android,sharedpreferences,static-methods,static-members,Java,Android,Sharedpreferences,Static Methods,Static Members,我需要从名为a的抽象类中获取对共享pref的引用,该抽象类不扩展任何内容 我无法将Context对象传递给这个类来获取共享的pref,因为它是抽象的,我没有实例化它。我创建了一个类A,由共享单个属性的其他POJO扩展,该属性是uuid。UUID在第一次运行时在应用程序中生成一次,这就是我将其存储在共享pref中的原因。在类A的构造函数中,我希望根据共享prefs中的内容设置uuid public abstract class A { private String uuid; pu
a
的抽象类中获取对共享pref的引用,该抽象类不扩展任何内容
我无法将Context
对象传递给这个类来获取共享的pref,因为它是抽象的,我没有实例化它。我创建了一个类A
,由共享单个属性的其他POJO扩展,该属性是uuid
。UUID在第一次运行时在应用程序中生成一次,这就是我将其存储在共享pref中的原因。在类A
的构造函数中,我希望根据共享prefs中的内容设置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
}
是扩展应用程序
,比如在名为App
的类中,并在清单中的
标记中包含一个属性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;
}
}
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;
}
}
…以便从类A
内部执行以下操作:
this.uuid = App.getApp().getSharedPreferences("prefs_name.txt", Context.MODE_PRIVATE).getString("KEY_UUID", "null");
但是,非最终静态字段app
是否会丢失对app
的引用,并在Android关闭进程或手机重新启动时变为空?如果不使用此方法,如何获取对共享pref的引用?还是应该手动将UUID写入文件
我无法将上下文对象传递给此类以获取共享的pref,因为作为抽象对象,我没有实例化它
当然可以。将Context
作为参数放在构造函数上。或者,如果愿意,将SharedReferences
作为参数放在构造函数上。子类的构造函数将需要获取相同的参数并将其传递给super()
调用
然而,当Android关闭进程或手机重启时,非最终静态字段应用程序是否会丢失对应用程序的引用并变为空
整个过程都结束了。说它“失去了对应用程序的引用并变为空”类似于说一个人在核爆炸的地面零点会在蒸发之前被晒伤——虽然可能是真的,但这一点有点没有意义。:-) 将应用程序类修改为以下内容:
public class App extends Application {
private static App app;
public void onCreate() {
this.app = this;
}
public static App getApp() {
return 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;
}
}
我担心从实例化子POJO的活动和服务中传递
这个
,然后将其传递给A
不是一个好的设计。但我想我没有太多选择。@MattQuiros:那就不要通过这个。传递SharedReferences
。或者,更好的方法是传递实际的UUID字符串。或者,更好的是,如果此UUID在整个过程中是唯一的(“UUID在应用程序第一次运行时在应用程序中生成一次,这就是我将其存储在共享pref中的原因”),则将其放入静态数据成员中,并跳过在每个POJO中加载。UUID实际上是应用程序安装的唯一标识符,因此,除非用户卸载并重新安装应用程序,否则不应再次生成该应用程序。所以我想我不能做你最后的建议,而只是传递UUID,而不是this
或SharedReferences
@MattQuiros:“所以我想我不能做你最后的建议”——我最后的建议是将UUID缓存在静态数据成员中。你当然可以做到。在开始创建POJO之前,只需从SharedReferences
初始化该静态数据成员。为了在第一次运行时创建UUID,您必须在任何POJO检查之前进行一次检查,所以此时只需将新的或现有的UUID存储在静态数据成员中即可。顺便说一句,请记住,对于Android 4.2+上相同设备的不同用户,您的UUID将不同。感谢4.2上的提醒,但是如果我将UUID存储在静态数据成员中,当进程终止或手机重新启动时,它将返回到其原始状态。我刚刚测试了它,将一个全局静态int
初始化为-1
,并在活动中增加其值。当我重新启动手机并再次启动应用程序时,int
的值回到-1
。我希望我正确地理解了你的意思?这不是和问题中的应用程序的效果一样吗?试试这个