2

A何も拡張しないという抽象クラス内から共有設定への参照を取得する必要があります。

Context抽象的であるため、インスタンス化しないため、オブジェクトをこのクラスに渡して共有設定を取得することはできません。A単一の属性(。)を共有する他のPOJOによって拡張されるクラスを作成しましたuuid。UUIDは、最初の実行時にアプリで1回生成されるため、共有設定に保存します。クラスのコンストラクターでは、共有設定にあるものに基づいて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
}

私が見つけた1つの提案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がプロセスを終了したとき、または電話が再起動したときに、アプリへの参照を失い、nullになりませんか?

さて、プロセス全体がなくなりました。それが「アプリへの参照を失い、ヌルになる」と言うことは、核爆発のグラウンドゼロにいる人が気化する直前に日焼けするだろうと言うことに似ています-おそらく本当ですが、要点は少し議論の余地があります。:-)

于 2012-11-24T12:55:52.193 に答える