Совместное использование общего предпочтения с другим приложением дает старые / кэшированные значения - PullRequest
0 голосов
/ 07 июня 2018

У меня есть два приложения, скажем, A и B. Приложение A имеет общий префикс, который создан как читабельный для всех, так что приложение B может получить к нему доступ.Когда я в первый раз пытаюсь получить доступ к общему значению префикса приложения A из приложения B, это дает правильный результат.Но проблема возникает, когда я изменяю значение общего префикса приложения A, а затем открываю приложение B, чтобы проверить обновленный общий преф, он дает то же самое старое значение.И что удивительно, когда я принудительно закрываю приложение B из настроек -> приложения и снова открываю приложение B, оно дает правильное обновленное значение общего префикса приложения A.

В чем проблема доступа к общему префу приложения, когда оноимеет значение WORLD_READABLE.

Ниже приведен исходный код приложения B , когда я обращаюсь к общему префру приложения A .

private boolean isDAEnabled() throws SecurityException {
    Context context = null;
    try {
        context = createPackageContext(APP_A_PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
    if (context == null) {
        throw new SecurityException("can not read shared pref of old DAE");
    }

    SharedPreferences oldDaPrefs = context.getSharedPreferences
            (A_SHAREDPREF_FILE_NAME, Context.MODE_WORLD_READABLE);

    int what = oldDaPrefs.getInt(A_PREF_ENGINE_STATE, 4);
    Log.d(TAG, "What is value "+ what);
    return  what == ENABLE_ENGINE; // ENABLE_ENGINE IS == 0

}

ИНиже приведен код, в котором я изменяю общие настройки Приложение A

private void setEnginePreference(boolean engineStatus) {
    mPreferenceEditor = mPreference.edit();
    if(engineStatus){
        mPreferenceEditor.putInt(Constants.PREF_ENGINE_STATE, ENABLE_ENGINE);
    } else {
        mPreferenceEditor.putInt(Constants.PREF_ENGINE_STATE, DISABLE_ENGINE);
    }
    mPreferenceEditor.commit();
}

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Отвечая на мой собственный вопрос, когда я нашел решение.

В блоге я обнаружил, что могу использовать MODE_MULTI_PROCESS при доступе к общим настройкам другого приложения (например, приложение A в моем случае).Однако, начиная с уровня API 23 (версия ОС 6.0), Context.MODE_MULTI_PROCESS устарела.Но мое требование состояло только в том, чтобы поддерживать API-уровень 23, так что это было хорошо для меня.

Вот изменение, которое мне пришлось внести

private boolean isDAEnabled() throws SecurityException {
Context context = null;
try {
    context = createPackageContext(APP_A_PACKAGE_NAME, Context.CONTEXT_IGNORE_SECURITY);
} catch (PackageManager.NameNotFoundException e) {
    e.printStackTrace();
}
if (context == null) {
    throw new SecurityException("can not read shared pref of old DAE");
}

SharedPreferences oldDaPrefs = context.getSharedPreferences
        (A_SHAREDPREF_FILE_NAME, Context.MODE_MULTI_PROCESS);

int what = oldDaPrefs.getInt(A_PREF_ENGINE_STATE, 4);
Log.d(TAG, "What is value "+ what);
return  what == ENABLE_ENGINE; // ENABLE_ENGINE IS == 0}

Я надеюсь, что это поможет другим.

0 голосов
/ 07 июня 2018

Изменить это:

private void setEnginePreference(boolean engineStatus) {
    mPreferenceEditor = mPreference.edit();
    if(engineStatus){
        mPreferenceEditor.putInt(Constants.PREF_ENGINE_STATE, ENABLE_ENGINE);
    } else {
        mPreferenceEditor.putInt(Constants.PREF_ENGINE_STATE, DISABLE_ENGINE);
    }
    mPreferenceEditor.commit();
}

На:

private void setEnginePreference(boolean engineStatus) {
    mPreferenceEditor = mPreference.edit();
    if(engineStatus){
        mPreferenceEditor.putInt(Constants.PREF_ENGINE_STATE, ENABLE_ENGINE);
    } else {
        mPreferenceEditor.putInt(Constants.PREF_ENGINE_STATE, DISABLE_ENGINE);
    }
    mPreferenceEditor.apply();
}
...