Не удается поделиться SharedPreferences между активностью и удаленным сервисом - ошибка Android или функция? - PullRequest
1 голос
/ 03 января 2012

Я хочу обновить удаленный сервис при изменении 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 по совпадению?Любые предложения будут оценены.

Ответы [ 3 ]

8 голосов
/ 05 января 2012

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

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

0 голосов
/ 06 марта 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;
}
0 голосов
/ 03 января 2012

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

...