У меня есть приложение, которое состоит из двух отдельных процессов;основное приложение и фоновая служба, в которой отдельный манифест определен с помощью android:process=":process_name"
в манифесте.
При использовании SharedPreferences
я наблюдаю, что могу сохранять и загружать значения в одном процессе и извлекать их вдругой процесс полностью в порядке.
Основная активность:
override fun onStart() {
// ...
val prefs = getSharedPreferences(PREFERENCES_ID, Context.MODE_PRIVATE)
val editor = prefs.edit()
editor.putInt("TEST", 42)
editor.commit()
}
Служба:
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
// ...
val prefs = getSharedPreferences(PREFERENCES_ID, Context.MODE_PRIVATE)
val retrieved = prefs.getInt("TEST", -1)
Log.d("Service", "Retrieved $retrieved") // prints "Retrieved 42"
}
Однако при регистрацииOnSharedPreferenceChangeListener
чтобы наблюдать за этими изменениями как в активности, так и в сервисе, я получаю только изменения моего экземпляра SharedPreferences
в процессе, в который было внесено изменение. (Это также происходит при создании экземпляра общих настроек с помощью Activity / Service applicationContext
.)
Я также отмечаю, что такое поведение не происходит при удалении директивы android:process
в манифесте, что приводит меня кПоверьте, разные процессы вызывают это поведение.
- Есть ли какая-то разница в том, как изменения передаются слушателям через разные процессы?
- Можно ли наблюдать за этими изменениями в разных процессах?
(я подтверждаю, что могу переместить свое приложение в отдельный процесс или реализовать «измененный»)сообщение какого-то другого типа через IPC, например Messenger
, каждый раз, когда мой код вносит изменения в SharedPreferences
, однако это не очень привлекательные варианты для этого приложения.)