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
"никто".
Однако, когда я меняю порядок 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
вернет "нет" и externalPincode
"DDDD" в обоих случаях.
Почему не так?
1 ответ
У меня есть приложение 2 (com.mine.app2), в котором я пытаюсь прочитать SharedPreference из приложения 1.
Это не отличная идея. Пользователь может избавиться от Приложения 1, когда пожелает, и в этот момент Приложение 2 больше не может получить эти данные.
Вместо этого используйте модель синхронизации. Приложение 1 рассылает трансляцию Intent
когда предпочтения меняются, с прикрепленным разрешением на уровне подписи, так что только Приложение 2 (или любые другие, которые вы пишете) могут получить его. Приложение 2 может затем обновить свое собственное локальное хранилище данных (например, свое собственное SharedPreferences
). Приложение 2 может делать то же самое, позволяя пользователю изменять свою копию данных о предпочтениях и рассылать широковещательные сообщения, чтобы сообщить другим приложениям. Таким образом, если какое-либо одно приложение будет удалено, другие приложения не потеряют свои данные о предпочтениях, но все может оставаться в синхронизации.