Есть ли способ сделать SharedPreferences глобальным во всем моем приложении для Android?

Есть ли способ сделать SharedPreferences глобальным во всем моем приложении? Сейчас я использую эти строки во многих местах всего своего кода, чтобы хранить простые настройки включения/выключения для ряда настроек, которые могут быть установлены моими пользователями. Я просто хочу назвать их когда-нибудь глобально, если это возможно:

SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();

Любые подсказки о том, как иметь возможность вызывать только эту строку во всех классах, были бы замечательными:

editor.putString("examplesetting", "off");
editor.commit(); 

и

String checkedSetting = settings.getString("examplesetting", "");

Ответ 1

Я знаю, я знаю, я буду воспален и брошен в уголки ада....

Используйте одноэлементный класс, который обтекает настройки SharedPreference.. что-то вроде этого:

public class PrefSingleton{
   private static PrefSingleton mInstance;
   private Context mContext;
   //
   private SharedPreferences mMyPreferences;

   private PrefSingleton(){ }

   public static PrefSingleton getInstance(){
       if (mInstance == null) mInstance = new PrefSingleton();
       return mInstance;
   }

   public void Initialize(Context ctxt){
       mContext = ctxt;
       //
       mMyPreferences = PreferenceManager.getDefaultSharedPreferences(mContext);
   }
}

И создайте функции-обертки вокруг того, что представлены ваши примеры в вопросе, например

PrefSingleton.getInstance().writePreference("exampleSetting", "off");

и реализация может быть примерно такой:

// Within Singleton class

public void writePreference(String key, String value){
     Editor e = mMyPreference.edit();
     e.putString(key, value);
     e.commit();
}

С вашего первого действия активируйте класс singleton таким образом, что-то вроде этого:

PrefSingleton.getInstance().Initialize(getApplicationContext());

Причина, по которой я рискую голосом, - использовать глобальные статические классы, может быть плохой идеей и идет вразрез с практикой фундаментальных принципов программирования. НО, сказав, что, как ничтожный в стороне, он гарантирует, что только один и только объект класса PrefSingleton может существовать и быть доступен независимо от того, какие действия он выполняет.

Ответ 2

Я бы расширил Application и включил SharedPreferences.Editor в качестве поля с геттером.

public class APP extends Application {
    private final SharedPreferences settings = getSharedPreferences("prefs", 0);
    private final SharedPreferences.Editor editor = settings.edit();

    public SharedPreferences.Editor editSharePrefs() {
        return editor;
    }
}

Затем вы можете получить к нему доступ из любого Activity с помощью

((APP) getApplication()).editSharePrefs().putString("examplesetting", "off");
((APP) getApplication()).editsharePrefs().commit();

В качестве альтернативы вы также можете использовать метод

    public static APP getAPP(Context context) {
        return (APP) context.getApplicationContext();
    }

Хотя это просто изменит ваши вызовы на

APP.getAPP(this).editSharePrefs().putString("examplesetting", "off");
APP.getAPP(this).editsharePrefs().commit();

Таким образом, это действительно личное предпочтение, которое выглядит более чистым для вас.

Ответ 3

Я бы сделал следующее:

public class BaseActivity extends Activity {

        protected boolean setInHistory;
        protected SharedPreferences sharedPrefs;

            @Override
        protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
    setInHistory = true;
       }


}


public class MainActivity extends BaseActivity {

         public void onCreate(Bundle savedInstanceState) {
               super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

              System.out.println(setInHistory+" <-- setInhistory");

          }
}

Затем можно получить доступ к sharedPrefs, потому что он защищен, а затем доступен через пакет.

In the console you have : true <-- setInhistory

Ответ 4

Используйте класс помощника, чтобы получить все, что хотите, сделать методы static.This, как ADW ​​делать.

Ответ 5

Используйте это, чтобы установить настройку:

public static void SetCheckedSetting(Context context, String value)
{
    SharedPreferences settings = getSharedPreferences("prefs", 0);
    SharedPreferences.Editor editor = settings.edit();
    editor.putString("examplesetting", value);
    editor.commit();
}

И чтобы получить настройку:

public static String GetCheckedSetting(Context context)
{
    SharedPreferences settings = getSharedPreferences("prefs", 0);
    return settings.getString("examplesetting", "");
}

Чтобы передать контекст, вы можете просто использовать ключевое слово this.

Важно, чтобы вы не сохраняли SharedPreferences как статическую переменную. Если вы это сделаете, это приведет к утечке памяти. См.: http://android-developers.blogspot.in/2009/01/avoiding-memory-leaks.html