最佳实践?在活动之间传递参数

Posted

技术标签:

【中文标题】最佳实践?在活动之间传递参数【英文标题】:Best Practise? Pass parameter between activities 【发布时间】:2019-02-04 00:29:10 【问题描述】:

在活动之间传递参数的最佳方法是使用 putExtra() 方法。可以通过 putParcelable() 传递对象。但并非所有对象都是可包裹的。如果你想传递一个不可包裹的对象,你怎么能这样做?

我通过在目标活动中创建一个静态对象变量并在调用活动中填充这个变量来解决这个问题。这是一个很好的可能性还是我不应该这样做。如果是,为什么?这会导致任何问题吗?

例子:

主活动

class FirstActivity extends AppCompatActivity 

  MyOwnNotParcelableObject mObject;

  public void openNextActivity() 
    final Intent intent = new Intent(this, SecondActivity.class);
    SecondActivity.mObject = mObject;  //<--Fills the static variable
    startActivity(intent);
  

第二个活动

class SecondActivity extends AppCompatActivity 

  static MyOwnNotParcelableObject mObject;


【问题讨论】:

这不是一个好方法,也需要处理。就像有时您需要在实际上不需要时清除此变量。 【参考方案1】:

如果你想传递一个不可包裹的对象,你怎么能这样做?

使用 ViewModel:https://developer.android.com/topic/libraries/architecture/viewmodel

对于共享原始数据,使用 shared-preference,对于复杂数据/非 Parcelable 数据,使用 ViewModel。

扩展 ViewModel 类有很多好处:

您无需担心 UI 数据持有者的生命周期。 ViewModel 将由工厂自动创建,您无需自行处理创建和销毁 数据会一直更新 — 电话后你会得到相同的数据 像以前一样旋转。多亏了这一点,您无需通过 手动数据到新活动或再次调用 数据库。一切都为您完成! 数据等着你。如果您要进行 API 调用,您将旋转手机并在重新创建活动之前传递结果,您确定数据将存储在 ViewModel 中,并且您可以在活动重新创建后立即获取它

【讨论】:

谢谢。这是一个不错的解决方案,但它还是很复杂,比如让我自己的对象可打包。【参考方案2】:

不推荐使用静态对象。您可以将数据保存在共享首选项中,然后在其他活动中检索。

【讨论】:

【参考方案3】:

@ANMOL 斯里瓦斯塔瓦 很抱歉与您发生冲突,但目前在活动中不会发生这种情况。

您所说的在片段中是正确的,因为视图模型实例将链接到上下文。 如果我们从活动实例 A 插入 ViewModel,我将不会在活动 B 中拥有相同的数据,除非我使用创建单个实例副本的工厂。该probelam也在下面。如何管理视图模型的 oncleared?

这是个好问题。所以,我建议你只在一个活动和它的片段之间使用视图模型。因此,1 个活动可以拥有由父活动实例的 N 个视图模型链接的 N 个片段。要在活动之间传递数据,如果对象保存在数据库中,则传递一个 id 并从 ViewModel 中检索它。如果它没有保存在数据库中,则将临时对象保存在某处但不在共享中!它会减慢 UI

【讨论】:

以上是关于最佳实践?在活动之间传递参数的主要内容,如果未能解决你的问题,请参考以下文章

在另一个活动托管的片段之间传递数据的最佳实践

在 Web API 中传递枚举参数的最佳实践

复制通过引用方法传递的参数的最佳实践,避免无意中修改参数

在活动之间传递参数 - null

如何在活动之间传递参数?

在页面之间传递数据的最佳实践