您无法在不同的活动中观察对象。您所能做的就是使用 Intents 在 Activity 之间传递数据。
在 Android 中,观察者模式是通过使用 ViewModel 类和 LiveData / StateFlow 类来实现的。如果您想要 3 个不同的屏幕来观察单个对象的变化。您需要有 3 个 Fragment 共享相同的 Activity 和相同的 ViewModel。
public class SharedViewModel extends ViewModel {
private final MutableLiveData<Item> selected = new MutableLiveData<Item>();
public void select(Item item) {
selected.setValue(item);
}
public LiveData<Item> getSelected() {
return selected;
}
}
此处的 LiveData 是您通过所选变量间接更新的主题。可以通过从 Fragment 调用 select() 函数来更改所选变量。在每个 Fragment 中,您必须创建 ViewModel 并观察 LiveData。
public class ListFragment extends Fragment {
private SharedViewModel model;
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
model = new ViewModelProvider(requireActivity()).get(SharedViewModel.class);
itemSelector.setOnClickListener(item -> {
model.select(item);
});
model.getSelected().observe(getViewLifecycleOwner(), item -> {
// Update the UI.
});
}
}
您可以在此处阅读有关上述示例的更多信息:https://developer.android.com/topic/libraries/architecture/viewmodel#java
此解决方案也更可取,因为 ViewModel 在配置更改后仍然存在,并且即使在 Activity 被销毁后也可以恢复您的 Activity 状态。
此外,您不应在另一个 Activity 或 ViewModel 中保留对一个 Activity 的任何引用,因为这可能导致内存泄漏。
如果您找到了用例,您可以尝试在同一活动或 ViewModel 中的对象之间创建自己的观察者模式,但在大多数情况下,LiveData 和 StateFlow 应该足以更新您的 UI。