4

之前有人问过这个问题,但没有回应,所以我会尝试用不同的方式来表达这个问题。Service在无法绑定或自己启动的情况下,将某些数据传递给 Android 的各种方法是什么?

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

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

还有其他想法吗?提前致谢。

4

1 回答 1

2

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

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

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

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

在静态字段中存储值也存在类似问题。只有当它们的声明上下文(即声明它们的类)被加载到虚拟机的内存中时,这些字段才存在。由于在不使用服务并且前台没有显示应用程序的任何活动时,VM 可能随时被终止,因此您无法确定放入静态字段的数据在您需要它的整个持续时间内仍然存在。

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

于 2014-08-10T07:33:45.383 回答