Parcelable 对象缓存

Parcelable object caching

我正在设计一个在 Android.When 上使用 NFC 的应用程序,读取标签后,系统会向 activity 发送一个 Tag 对象。 Tag 对象是一个 Parcelable 对象。由于我想稍后根据用户设置在这个标签上写,我需要以某种方式 "cache" 这个对象。我虽然稍后甚至使用粘性广播来检索它,但从 Lollipop 开始,粘性广播已被弃用。另一种选择是保存在磁盘上,但正如文档所说,保存 Parcelable 并不是一件好事。我想如果我在文件上缓存对象,用户更改 android 版本,标签对象不同,然后可能会发生崩溃,就会发生问题。我只需要一个内存缓存,但在我看来没有办法强制 Android 保留内存缓存,我可以使用粘性服务,但 Android 可以随时终止我的服务。这种情况下最好的方法是什么?

When a tag is read, the system sends to an activity a Tag object.

正确。并且,此时 activity 和您的进程位于前台。我们稍后会回到这一点。

Since I want to write later on this tag

没有 "later" 的意义。您等待的每一毫秒都是用户有机会将设备移出标签范围的一毫秒,此时 Tag 对象无用。即使用户稍后将设备移回标签范围内,您也会得到一个新的 Tag 对象。

according to user settings, I need to "cache" this object in some way.

不是真的。您只需要将 Tag 传递给任何需要它的人。它是一个 Java 对象,因此它可以作为参数传递给您需要的方法。它是 Parcelable,因此您甚至不受 Intent 障碍的限制,因为您可以将 Tag 放在 Intent extra.

Even 5 seconds is a problem

是的,只要用户那时可能已经将他们的设备从标签上移开。

because I can't pass the Tag object "around".

是的,您可以,因为它是一个 Java 对象——请参阅本回答前面的内容。

I would need a memory cache just for few seconds

五秒钟后,静态数据成员将正常工作。

but Android doesn't provide any tool to keep a memory cache

Android 中的静态数据成员与普通 Java 中的静态数据成员一样工作。

我的猜测是您担心您的进程被终止。正如此答案顶部所述,在您获得 Tag 的时间点,您的流程具有前景重要性。它不会终止,直到用户执行某些操作(例如,按 HOME)将您的应用移至后台。您的后台进程有可能在五秒钟内终止。然而,如果用户决定离开你的应用程序,这将是一个信号,表明用户不希望你再弄乱 NFC 标签。

欢迎您使用服务来尝试增加您的进程存活五秒的几率。在这一点上,用户在这五秒内将他们的设备从标签中移除的可能性 far 比你的后台进程在同样的五秒内终止的可能性要大。

就个人而言,如果我尝试编写一个使用 NFC 且可靠的应用程序,我会在收到 后立即写信给 Tag 。延迟意味着应用程序的可靠性可能会下降,并且更多是由于用户操作而不是由于进程被终止。