最佳实践:在Android活动之间传递对象

7
我想知道在活动之间传递对象的最佳实践是什么?我的注销用户正在内容项目上,登录流程后应该能够返回此项目。因此,我需要在这些活动之间传递内容ID。
我看到两个基本选项: 1. 将内容ID作为URI传递到意图中(intent.putExtra()),并在活动之间传递它们。 2. 将内容ID保存到本地存储中,在登录后再次加载它。
还有其他选择和最佳实践吗?

在你提到的两个选项中,将id作为Intent额外参数传递的优点是Android会自动跟踪它在应用程序后台/恢复期间的状态,并在活动完成时清理它。 - Barend
你说的是什么类型的“对象”?它已经被持久化了吗?你应该避免在意图中发送复杂的“对象”。 - Xaver Kapeller
最好的方法是传递复杂的内容对象,以减少服务器请求,但也可以只存储ID并重新加载项目。 - sonix
你的办公室里有一群猴子在给你的问题点赞吗?(我觉得这有点离题了) - musefan
1个回答

2
我建议使用SharedPreferences,这就像选项2一样。 它允许您在应用关闭后获取内容ID(或字符串或JSON对象)。 您还可以在将其放入SharedPreferences之前加密内容ID。
除了意图(RAM)和本地存储(ROM / SDCard,包括数据库),我看不到其他任何选项(本地)。

Case 1: you need to resume activity after the app is closed
you should use local storage

Case 2: you don't need to resume activity after the app is closed

option 1:
  0. load the first activity
  1. start login_activity (startActivityForResult()) (do not call finish() )
  2. after login is done (call finish())
  3. activity is resumed (if login fail -> redirect to other activity )

option 2:
  1. create a public class with a data member to save the content-id/activity class
     (you may assign singleton design pattern) 

我已经在使用SharedPreferences来存储登录数据。但是我在想,如果将来每个活动都“滥用”这个存储,那么它是否会变得过于复杂。 - sonix
我了解你的观点。在我看来,如果有iOS应用程序/网站以及Android应用程序,服务器应该负责。 但在这种情况下,我认为它取决于您想要缓存的数据量。如果有大量数据,我们肯定会使用数据库,但如果只有一个字符串(内容ID),我不认为存储是“被滥用”的。 - AC28
加载内容没问题。但是SharedPreferences的另一个问题是:如果用户没有完成登录,如何清理存储?难道要在每次应用关闭、返回等情况下都做出反应吗? - sonix
为了清理存储,您可以参考“浏览器中我的Cookie何时/如何被删除”,并设置时间限制(比如5天)。 对不起,您的意思是“用户没有完成登录”吗? 在每次活动/内容ID更改(登录后),您可以覆盖/追加本地存储中的“lastContentId”。 - AC28
我有以下工作流程:Contentdetail Activity(设置id)=> Onboarding Activity => Login Activity => Base Activity(加载id)=[注入id]=> Contentdetail Activity当用户在onboarding login和base activity期间关闭应用程序时,我必须对每个onAttachedToWindow做出反应。 - sonix
选项2非常好用,而且易于使用。谢谢。我添加了一个put(id)和getAndClear()方法,这使得我可以在查询内容时立即删除它,以确保它抛出错误而不是产生副作用。在Scala中,它看起来像这样:`class TransferObject[T] { @volatile private var transferItem: Option[T] = None def put(item: T) = { transferItem = Some(item) } def getAndClear: Option[T] = { val item = transferItem transferItem = None item } }` - sonix

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接