管理AAR库中的sharedPreference

时间:2017-09-30 21:37:10

标签: android sharedpreferences android-context aar

我正在建立一个AAR图书馆。由于我的库中有一个复杂的设置。我希望帮助使用此库的用户可以轻松设置/记住他们的设置。因此,我尝试让我的AAR库管理用户的sharedPreference。

例如,这是我项目的结构

AppAAA (dependent on LibBBB)
| - MainActivity

LibBBB
| - LibSetting
| - LibSettingFragment
| - LibSettingActivity
| - ... - preferences.xml

我尝试实现类似的东西:

public class LibSetting() {
    static final String KEY_SERVER_PORT = "PREF_KEY_SERVER_PORT";
    SharedPreferences pref;
    Context context;
    public LibSetting(Context context) {
        this.context = context;
        this.pref = ((Activity)context).getPreferences(Context.MODE_PRIVATE);
    }

    public int getServerPort() {
        return pref.getInt("PREF_KEY_SERVER_PORT", 50005);
    }

    public void showSettingActivity() {
        Intent i = new Intent(context.getApplicationContext(), LibSettingActivity.class);
        context.startActivity(i);
    }
}

LibSettingActivity和LibSettingFragment的实现是微不足道的。我基本上只是调用" addPreferencesFromResource(R.xml.preferences);"加载我的首选项以设置(注意:我在xml中使用相同的键,PREF_KEY_SERVER_PORT)。

但是,它不起作用。 LibSettingFragment设置的首选项完全没有传播到pref.getXXX()加载的首选项;

我的猜测是因为LibSettingFragment无法知道我想从"应用程序的上下文"中设置首选项。而不是lib的上下文。我该怎么办?

2 个答案:

答案 0 :(得分:1)

  

LibSettingActivity和LibSettingFragment的实现是微不足道的。我基本上只是调用“addPreferencesFromResource(R.xml.preferences);”加载我的首选项以设置(注意:我在xml中使用相同的键,PREF_KEY_SERVER_PORT)。

如果您打算分发此库,我不建议这样做。您的图书馆现在正在污染应用的主要SharedPreferences

  

LibSettingFragment设置的首选项完全没有传播到pref.getXXX()加载的首选项;

那是因为你使用了错误的SharedPreferencesPreferenceFragment使用应用的主SharedPreferences,通过PreferenceManager.getDefaultSharedPreferences()检索。

在库中使用您自己的“私有”SharedPreferences是可以的,但它确实会给某些应用程序带来一些问题(例如,那些需要控制所有数据存储,加密的应用程序)。

答案 1 :(得分:0)

CommonsWare提供了正确的答案。但是对于仍然想要使用app的sharedPreference(而不是DefaultSharedPreference)的人来说,黑客攻击会有助于这样做:

    @Override
    public void onResume() {
        super.onResume();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onPause() {
        super.onPause();
        // Set up a listener whenever a key changes
        getPreferenceScreen().getSharedPreferences().unregisterOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
        // passed as an input argument from the app
        appPref.edit().putInt(key, 99999).commit();
    }