Перекрестные приложения SharedPreferences

У меня есть 2 приложения Приложение 1 (com.mine.app1), в котором я объявил SharedPreference.

SharedPreferences controlinfo = getSharedPreferences("pincode", MODE_WORLD_WRITEABLE | MODE_WORLD_READABLE);
SharedPreferences.Editor editor = controlinfo.edit();

editor.putString("pincode", "dddd");
editor.commit();

У меня есть приложение 2 (com.mine.app2), в котором я пытаюсь прочитать SharedPreference из приложения 1.

Здесь у меня есть следующий код (под кнопкой мыши):

Context con = createPackageContext("com.mine.app1", 0);
SharedPreferences interalPref = getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 2 (this app)
SharedPreferences externalPref = con.getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 1
//note: MODE_PRIVATE doesn't matter

String internalPincode = interalPref.getString("pincode", "none");
String externalPincode = externalPref.getString("pincode", "none");

В этом случае я получаю для internalPincode и externalPincode "none".

Однако, когда я меняю порядок getSharedPreference:

Context con = createPackageContext("com.mine.app1", 0);
SharedPreferences externalPref = con.getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 1
SharedPreferences interalPref = getSharedPreferences("pincode", MODE_PRIVATE); //shared pref of App 2 (this app)

String internalPincode = interalPref.getString("pincode", "none");
String externalPincode = externalPref.getString("pincode", "none");

В этом случае я получаю как для internalPincode, так и externalPincode "dddd" (это значение, заданное в приложении 1 (com.mine.app1))

Я ожидаю, что internalPincode вернет "none" и externalPincode "dddd" в обоих случаях.

Почему это не так?

Ответ 1

У меня есть приложение 2 (com.mine.app2), в котором я пытаюсь прочитать SharedPreference из приложения 1.

Это не отличная идея. Пользователь может избавиться от приложения 1 по своему усмотрению, после чего приложение 2 больше не сможет получить данные.

Вместо этого используйте модель синхронизации. Если приложение 1 отправляет широковещательную рассылку Intent при изменении настроек с прикрепленным разрешением на уровне подписей, это может получить только приложение 2 (или любые другие, которые вы пишете). Приложение 2 может затем обновить свое собственное локальное хранилище данных (например, собственное SharedPreferences). Приложение 2 может сделать то же самое, позволяя пользователю изменять свою копию данных предпочтений и отправлять широковещательные сообщения, чтобы сообщить другим приложениям. Таким образом, если какое-либо одно приложение удалено, другое приложение не потеряет свои данные предпочтений, но все может оставаться в синхронизации.