2015-04-05 173 views
0

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

+0

你是否真的需要这样一个强大的持续不断的坚持为你的标签对象? :) – agamov 2015-04-05 09:58:02

+0

“因为我想写在这个标签后面” - 人体模型或绑架人质以外,大多数用户会移动。 NFC标签本身将被取出Android设备的范围。即使用户稍后将标签移回范围,结果也将是“标签”的另一个实例。因此,一个'标签'只会对一秒钟左右有用。 – CommonsWare 2015-04-05 10:28:24

+0

@CommonsWare是的,但我不谈论几个小时。即使5秒钟也是一个问题,因为我无法将“标记”对象传递给“周围”。正如我所说我可以使用一项服务,但我没有获得任何服务保留的授权,我可能会丢失标签对象。 – greywolf82 2015-04-05 14:59:52

回答

2

当标签被读取时,系统发送一个活动一个标签对象。

正确。而且,在这一点上,这个活动和你的过程处于前台。我们稍后会回到这一点。

因为我想以后写一篇关于这个标签

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

根据用户设置,我需要以某种方式“缓存”这个对象。

不是。你只需要通过Tag来满足任何需求。它是一个Java对象,所以它可以作为参数传递给你需要的方法。它是Parcelable,所以你甚至没有受到Intent的限制,因为你可以将Tag加入Intent

连5秒钟都出了问题

是的,只要用户可能是由然后移动他们的设备从标签了。

因为我无法传递Tag对象“around”。

是的,你可以,因为它是一个Java对象 - 请参阅前面的答案。

我需要一个内存缓存仅仅几秒钟

五秒钟,静态数据成员将工作得很好。

但Android不提供任何工具来保持内存缓存

静态数据成员在Android的工作就像在普通的Java静态数据成员。

我的猜测是你担心你的进程被终止。正如本答案的顶部所指出的那样,在您获得Tag时,您的过程具有前景重要性。直到用户执行某些操作(例如,按HOME)才能将应用程序移动到后台,它不会被终止。您的后台进程有可能会在五秒内终止。但是,如果用户决定离开您的应用程序,这将是一个信号,表示用户不希望您再使用NFC标签。

欢迎您使用服务来尝试增加您的流程在五秒钟内存活的几率。在这一点上,它是更可能是用户将在这五秒钟内从标签中删除他们的设备,而后台进程将在相同的五秒内终止。个人而言,如果我试图编写使用NFC并且可靠的应用程序,我会立即在收到后立即写入Tag。延迟意味着应用程序的可靠性将下降,更多的是由于用户操作而不是由于进程被终止。

+0

你的回复是正确的。由于我为其他应用程序编写插件,所以我不能依赖额外的意图,或者至少我可以使用服务作为“临时存储”,因为我需要两个步骤的过程,这是一个漫长的故事:)。然而,我同意你的看法,这是一种黑客行为,NFC安卓管理告诉你:使用前台活动来写! :)谢谢你的回应。 – greywolf82 2015-04-05 15:28:42

+0

@ greywolf82:“因为我为另一个应用程序编写插件” - ick。在那种情况下,是的,我猜静态数据成员方法和你将要获得的一样好。但是,再一次,我担心用户离开标签比我担心流程消失更多。用户很容易感到无聊。 :-)我的答案让我有点不安,但插件场景很少见,并没有超出我的想法。 – CommonsWare 2015-04-05 15:33:53