4

アプリ内の複数の場所からアクセスしたい2Dおよび3D配列がいくつかあります。これらの配列は、アプリの起動時に文字列として読み込まれ、アクティビティで呼び出されるたびSharedPreferencesに保存されます。インテントまたはバンドルを使用してアクティビティ間でそれらを渡すのは面倒です。Androidにデータをグローバルに保存する方法はありますか?SharedPreferencesonPause()

4

3 に答える 3

2

SharedPreferencesにデータを保存する必要があり、アプリケーションの複数の場所にアクセスする必要がある場合は、以下のようなコードを実行します。

public class YourClassName extends Application{


    private static YourClassName mClassInstance;

    public static SharedPreferences mSharedPreferences;

    public static Editor mEditor;


    public static String KEY_DB_STATE="DbStateKey";

    public static String SHARED_PREFERENCE_NAME="YourClassNamePref";

    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }

    @Override
    public void onCreate() {
        super.onCreate();

        mClassInstance=this;
    }


    public static YourClassName getInstance(){
          checkAppCreated();
        return mClassInstance;
    }



    public static void checkAppCreated(){
         if (mClassInstance == null)
                throw new IllegalStateException("Application not created yet!");
    }



    @Override
    public void onLowMemory() {
        super.onLowMemory();
    }

    @Override
    public void onTerminate() {
        super.onTerminate();
    }


    public static void setDatabaseState(String sharedPreferenceName,boolean state){

        mSharedPreferences=getInstance().getSharedPreferences(sharedPreferenceName, Context.MODE_PRIVATE);
        mEditor=mSharedPreferences.edit();
        mEditor.putBoolean(KEY_DB_STATE, state);
        mEditor.commit();

    }


    public static boolean getDatabaseState(String sharedPreferenceName){
        mSharedPreferences=getInstance().getSharedPreferences(sharedPreferenceName, Context.MODE_PRIVATE);
        return mSharedPreferences.getBoolean(KEY_DB_STATE, false);
    }



}

ノート:

私のクラスの場合のように、アプリケーションクラスをAndroidマニフェストファイルに入れることを忘れないでください。

<application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" android:name="com.android.YourClassName">
于 2012-12-27T05:28:19.323 に答える
1

グローバルに保持する必要がある場合は、MyApplicationクラスに格納しています。ほとんどどこからでも、アプリケーション/アプリケーションコンテキストへの参照を取得できます。

メモリリークの警告:短いライブコレクション(アクティビティなど)の長いライブオブジェクトは、少なくとも私のアプリはほとんどの時間生きています!

于 2012-12-27T02:39:20.977 に答える
1

私たちが行ったことは、すべてが静的であるわけではありませんが、ほとんど静的フィールドと静的メソッドを使用するGlobalsクラスを使用しています。これらは主に、アプリ内のさまざまなクラス/アクティビティで使用される可能性のあるフィールドとメソッドです。これに伴う問題は、それが制御不能に成長することを許さないことです。たまに、何を取り出してクラスにまとめたり、既存のクラスに移動したりできるかを確認します。特定の状況でコンテキストを渡すか、アプリケーションのコンテキストを取得するメソッドを作成することで解決したアプリケーションコンテキストが必要になる場合があります。メモリリークに問題があるかもしれませんが、それは私がそうしないという意味ではありませんが、私は今のところ問題を抱えていません。

私はこれをしないように言われ、それはOOPではないと言われましたが、それは間違っていると思います。なぜこれが間違っているのかまだ誰も教えてくれません。それでもオブジェクトを作成し、OOP標準に従います。お役に立てて嬉しいです

于 2012-12-27T15:48:24.507 に答える