有没有办法让SharedPreferences在我的整个Android应用程序中全局化?

Eth*_*len 12 java android android-preferences

有没有办法让SharedPreferences在我的整个应用程序中全局化?现在我在我的代码中的很多地方使用这些行来存储我的用户可以设置的许多首选项的简单开/关设置.如果可能的话,我只想在全球范围内召集一次:

SharedPreferences settings = getSharedPreferences("prefs", 0);
SharedPreferences.Editor editor = settings.edit();
Run Code Online (Sandbox Code Playgroud)

关于如何在所有类中调用这些行的任何提示都会很棒:

editor.putString("examplesetting", "off");
editor.commit(); 
Run Code Online (Sandbox Code Playgroud)

String checkedSetting = settings.getString("examplesetting", "");
Run Code Online (Sandbox Code Playgroud)

t0m*_*13b 15

我知道,我知道,我会被发炎,并被铸入地狱的余烬......

使用包围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);
   }
}
Run Code Online (Sandbox Code Playgroud)

并围绕您的示例在问题中表示的内容创建包装函数,例如,

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();
}
Run Code Online (Sandbox Code Playgroud)

从您的第一个活动开始,以这种方式激活单例类,如下所示:

PrefSingleton.getInstance().Initialize(getApplicationContext());
Run Code Online (Sandbox Code Playgroud)

我冒险投票的原因是,使用全局静态类可能是一个坏主意,并违背编程基础的做法.但是,除此之外,它还将确保只有该类的唯一对象PrefSingleton才能存在并且无论代码处于何种活动状态,都可以访问它.

  • 偏好是否适用于应用程序上下文?很多事情都没有,所以使用它总是很棘手.此外,"第一个活动"有点未定义,因为应用程序可以从广播,待处理的意图(小部件等)启动. (2认同)
  • 如果扩展Application,是否无法初始化子类中的单例并避免出现"第一个活动"问题? (2认同)

gob*_*dor 10

我会扩展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;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以从任何访问它Activity

((APP) getApplication()).editSharePrefs().putString("examplesetting", "off");
((APP) getApplication()).editsharePrefs().commit();
Run Code Online (Sandbox Code Playgroud)

或者,您也可以使用该方法

    public static APP getAPP(Context context) {
        return (APP) context.getApplicationContext();
    }
Run Code Online (Sandbox Code Playgroud)

虽然,这只会改变你所做的电话

APP.getAPP(this).editSharePrefs().putString("examplesetting", "off");
APP.getAPP(this).editsharePrefs().commit();
Run Code Online (Sandbox Code Playgroud)

所以这真的是个人偏好,对你来说看起来更干净.

  • 虽然这有效,但使用应用程序类是有点过分的.更不用说你每次都必须把它投到你的具体课堂上.一个带有静态方法的简单助手类,它带有一个`Context`参数(你可以在一个活动中传递`this`)要好得多.在这种情况下,应用程序并没有真正给你买任何东西. (4认同)