Невозможно поделиться SharedPreferences между активностью и удаленной службой - ошибка или функция Android?

Я хочу обновить удаленную службу при изменении SharedPreferences. Следующее использовалось для работы с API уровня 8 (Android 2.2).

В моей активности есть OnPreferencesChangedListener, который вызывает удаленную службу через объект привязки службы. Интерфейс удаленной службы предлагает методы prefsChanged(void), которые вызываются слушателем. После этого методы интерфейса вычисляют, среди прочего, новое время, когда оповещение инициирует какое-либо действие. Это время также сохраняется в SharedPreferences и отправляется широковещательная рассылка. Трансляция получена моей активностью, которая теперь может отображать новое время оповещения. Активность и удаленная служба получают объект SharedPreferences через вызов статического метода GetPrefs(Context), который отвечает PreferenceManager.getDefaultSharedPreferences(Context).

С уровнем API 15 (Android 4.0.3) это перестало работать. Отладка показывает, что удаленная служба видит какую-то другую версию SharedPreferences, содержащую другие (более старые?) значения. При ведении журнала объект SharedPreferencesImpl отображает разные адреса при ведении журнала из действия и из удаленной службы. Файловая система показывает только один общий файл настроек.

Это ошибка или мой код случайно работал с API уровня 8? Любые предложения будут оценены.


person Stefan    schedule 03.01.2012    source источник


Ответы (3)


Ответ здесь, спасибо x90: https://stackoverflow.com/a/8723589/1127492

Использовать MODE_MULTI_PROCESS Это было устаревшее (но недокументированное) поведение в Gingerbread (Android 2.3) и до него, и этот флаг подразумевается при нацеливании на такие выпуски. Для приложений, предназначенных для версий SDK выше Android 2.3, этот флаг должен быть явно установлен, если это необходимо.

person Stefan    schedule 05.01.2012

Я бы посмотрел здесь: http://developer.android.com/sdk/api_diff/15/changes.html и просмотрите измененные пакеты, которые вы использовали в своем приложении.

person sschrass    schedule 03.01.2012
comment
Я уже просмотрел изменения между уровнями API 8 и 15. Я не нашел ничего, что могло бы объяснить изменение поведения. - person Stefan; 03.01.2012

Я столкнулся с той же проблемой при обновлении своего приложения с Froyo до ICS. Согласно исходному коду Context.getSharedPreferences от ICS, решение должно быть Context.MODE_MULTI_PROCESS

@Override
public SharedPreferences getSharedPreferences(String name, int mode) {
    SharedPreferencesImpl sp;
    synchronized (sSharedPrefs) {
        sp = sSharedPrefs.get(name);
        if (sp == null) {
            File prefsFile = getSharedPrefsFile(name);
            sp = new SharedPreferencesImpl(prefsFile, mode);
            sSharedPrefs.put(name, sp);
            return sp;
        }
    }
    if ((mode & Context.MODE_MULTI_PROCESS) != 0 ||
        getApplicationInfo().targetSdkVersion < android.os.Build.VERSION_CODES.HONEYCOMB) {
        // If somebody else (some other process) changed the prefs
        // file behind our back, we reload it.  This has been the
        // historical (if undocumented) behavior.
        sp.startReloadIfChangedUnexpectedly();
    }
    return sp;
}
person shaobin0604    schedule 06.03.2012