在多个 activities/fragments 之间同步数据

Synchronise data across multiple activities/fragments

我必须同步三个组件的数据。

  1. Activity - 这个 activity 从 Content Provider 获取数据并且有一个 ViewPager。它将此数据 (Fragment.getInstance(data...)) 传递给第二个组件,即 Fragment

  2. Fragment - 这个片段有一个特定项目的 RecyclerViewonClick(),数据通过 intent 传递给第三个Activity.

  3. 的组件
  4. Activity - 这里接收到的数据被修改。

在所有三个组件之间同步此修改的最佳方式是什么?

不要在不同的活动和片段之间持有对相同 POJO(普通旧 java 对象)的引用。请改用共享首选项或 SQL 数据库。

活动和片段应该是stateless。所以我要告诉你如何在活动和片段之间传输数据,而不是如何同步数据。

让我们逐一分析:

  • '1 到 2': 您可能已经拥有 activity 中的所有片段。所以只需调用 fragment.sendData(...) 即可将数据发送到片段。 警告: 如果您使用的是 FragmentStateAdapter,则必须这样做 (reference)

    if (adapter.getCount() > 0) {
        fragment = (MyFragment) adapter.instantiateItem(
                null, viewPager.getCurrentItem());
        // A NullPointerException is thrown if the item isn't initialized as yet
        // So be careful.
    }
    
  • '2 to 1': 创建片段回调接口(比如FragmentCallback),activity1 必须实现,即覆盖 Fragment.onAttach(Activity activty),检查是否 activity instanceof FragmentCallback,如果不是则抛出异常。 (这是android工作室在你创建新片段时自动生成的)

  • '1 到 3': 通过将 Intent 与数据一起传递来启动 activity。

  • '2 到 3': 通过将 Intent 与数据一起传递来启动 activity。如果您需要来自 activity1 的一些数据,请不要使用此方法。使用“2 到 1”,然后是“1 到 3”。

  • '3对1':正确的做法是重新开始activity1Intent 数据或将其发送到原始 activity1 使用 startActivtyForResult 并在 [= 中处理结果94=]1。如果需要,您可以使用 android:launchMode="singleTop" (ref)。如果你必须发送原件activitystartActivtyForResult无法满足的方式),它是绝对是代码味道。使用共享首选项或其他东西并在 Activity1.onResume and/or Activity1.onCreate.

  • 中检查它
  • '3 to 2':使用'3 to 1',然后是'1 to 2'。

我采用了简化通信的事件总线库。在 EventBus

查看