2

我需要从一个A不扩展任何东西的抽象类中获取对共享首选项的引用。

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

我发现的一个建议是扩展Application,比如说在一个名为 的类中,并在清单的标签中App包含一个属性。我想会这样写:android:name=".App"<application>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");

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

4

2 回答 2

2

将您的 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;
    }
}
于 2012-11-24T12:56:20.503 回答
1

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

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

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

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

于 2012-11-24T12:55:52.193 回答