Полное обновление вашего заднего стека, вероятно, является излишним и может добавить некоторые издержки / отставание к UX;и, как вы упомянули, большинство приложений не будет иметь доступа к полному статическому бэк-стеку.
По сути, вы описываете более общую проблему: глобальные изменения темы или самого WindowManager влияют на последующее рисование представлений.Но предыдущие макеты для действий в стеке не могут быть перерисованы.Это может показаться странным для вас в этой ситуации, но также может быть много веских причин, по которым вы не захотите перерисовывать активность в стеке, если пользователь вернется к ней.И поэтому это не автоматическая функция.
Я могу вспомнить пару вариантов:
1) Написать собственный класс, унаследованный от Activity, который делает недействительными все его представления, когда он снова перемещается в начало стека.Например, в onResume()
или onRestart()
, позвоните (если в Fragment
)
View view = getActivity().findViewById(R.id.viewid);
view.invalidate();
Используйте эту пользовательскую активность для всех ваших действий, которые вы хотите поддерживать в соответствии с текущим дневным / ночным режимом.
2) Используйте ActivityLifecycleCallbacks
.Это помогает хранить всю логику в одном месте и избавляет от необходимости настраиваемого наследования, как указано выше.Вы можете сделать недействительными свои взгляды, если действия будут приостановлены / возобновлены.Вы можете включить прослушиватель, если ваше приложение меняет тему, и записать, например, SharedPreference
.
Чтобы использовать, добавьте обратные вызовы в класс приложения:
registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
@Override
public void
onActivityCreated(Activity activity, Bundle savedInstanceState) {
//can check type of Activity for custom behaviour, if using inheritance
if(activity instanceof MainActivity) {
mMainActivities.put(activity, new MainActivityEntry((MainActivity)activity));
//...
}
}
@Override
public void
onActivityDestroyed(Activity activity) {
}
@Override
public void
onActivityPaused(Activity activity) {
}
@Override
public void
onActivityResumed(Activity activity) {
if(activity instanceof MainActivity) {
//...
}
//can update Entry properties too
final MainActivityEntry activityEntry = mMainActivities.get(activity);
if(activityEntry != null) {
//record state /perform action
}
}
@Override
public void
onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void
onActivityStarted(Activity activity) {
}
@Override
public void
onActivityStopped(Activity activity) {
}
});