从另一个Context传递信息到HostApduService

时间:2014-07-29 14:40:13

标签: android android-service ipc nfc hce

之前已经提出过没有回复的问题,所以我会试着用不同的方式来表达这个问题。将某些数据传递给Android Service而不能绑定到它或自己启动的各种方法有哪些?

问题在于 - 我在每次NFC卡交易时都有操作系统启动的HostApduService。它需要权限android.permission.BIND_NFC_SERVICE,这是系统权限,因此我的应用程序无法绑定到它。我不想让数据保持静止,所以任何写入磁盘的东西都是禁止的。我想到了一些可能的解决方案,但它们要么是凌乱的,要么是不安全的:

  1. 将数据放入我们应用的SharedPreferences中。这提出了DAR问题。
  2. Service广播信息。 HostApduService在卡交易期间运行,因此在开始工作之前,我无法可靠地将广播定时到达服务。
  3. 将我想要传递的信息放入某个地方的static字段中。这很麻烦,可能会导致并发问题,但我正在使用它。
  4. 还有其他想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:2)

我认为这个问题归结为另一个问题:

  

如何在绑定服务中存储(持久)数据?

HCE服务是绑定服务,因此只保证在其调用上下文存在时运行(请参阅here)。因此,您在服务中存储的任何数据(→RAM中存在的变量)将仅在服务的生命周期内存在,并且在重新启动服务后将不再可用。

因此,绑定到服务并在服务中设置某些值将无法可靠地工作,即使您可以绑定到HCE服务。同样的问题也适用于您广播到服务的数据。

在静态字段中存储值时存在类似的问题。只要它们的声明上下文(即声明它们的类)被加载到虚拟机的存储器中,那些字段就存在。由于VM可以在不使用服务的任何时候被杀死,并且前景中没有显示应用程序的活动,因此您无法确定放入静态字段的数据在您需要的整个持续时间内都能够存活

因此,存储数据的唯一可靠方法是使用持久存储技术,即使用SharedPreferences机制,使用内容提供程序(由数据库支持)持久存储)或直接将数据存储到文件。我想你能做的最好的事情就是将数据存储在加密的文件系统中。但是,这会带来另一个问题:如何(安全地)存储加密密钥。但您可以使用Android密钥库来充分解决问题(请参阅herehere)。