从另一个上下文向 HostApduService 传递信息
Posted
技术标签:
【中文标题】从另一个上下文向 HostApduService 传递信息【英文标题】:Passing information to a HostApduService from another Context 【发布时间】:2014-07-29 14:40:13 【问题描述】:之前有人问过这个问题,但没有任何回应,所以我会尝试用不同的方式来表达这个问题。将一些数据传递给 android Service
而不能够绑定到它或自己启动它的各种方法是什么?
这是问题所在 - 我有一个 HostApduService
,它由操作系统在每次 NFC 卡交易时启动。它需要权限android.permission.BIND_NFC_SERVICE
,这是一个系统权限,所以我的应用程序无法绑定到它。我不想让数据保持静止,所以任何写入磁盘的东西都是不行的。我想到了一些可能的解决方案,但它们要么乱七八糟,要么不安全:
-
将数据放入我们应用程序的 SharedPreferences 中。这提出了一个 DAR 问题。
将信息广播到
Service
。 HostApduService
在卡交易期间运行,因此我无法在广播开始工作之前可靠地确定广播到达服务的时间。
将我想要传递的信息放入static
字段中的某处。这很混乱,可能会导致并发问题,但这是我目前正在使用的。
还有其他想法吗?提前致谢。
【问题讨论】:
您能否提供一些关于这是什么数据以及如何/曾经/何时产生数据的见解?此外,您能否描述一下您打算如何与 HCE 服务进行交互如果您可以绑定到它? 我只想从用户输入发送一个由活动生成的字节数组。如果我可以绑定到它,我会公开一个实例方法setInformation(byte[] info)
,它将信息保存在服务内的实例变量(字段)中,以便稍后在调用 onStartCommand 时使用(当然,AFAIK 可以) t 绑定到服务,直到它启动)。
嗨,我正在尝试同样的事情,你解决了这个问题吗?
【参考方案1】:
我认为这个问题归结为另一个问题:
您将如何在绑定服务中存储(持久)数据?
HCE 服务是一个绑定服务,因此它只保证在其调用上下文存在时运行(请参阅here)。因此,您存储在服务中的任何数据(→ 存在于 RAM 中的变量)将仅在服务的生命周期内存在,并且在服务重新启动后将不再可用。
因此,即使您可以绑定到 HCE 服务,绑定到服务并在服务中设置一些值也不会可靠地工作。同样的问题也适用于您向服务广播的数据。
在静态字段中存储值也存在类似问题。只有当它们的声明上下文(即它们被声明的类)加载到虚拟机的内存中时,这些字段才存在。由于在不使用服务并且前台没有显示应用程序的任何活动时,可以随时终止 VM,因此您无法确定放入静态字段的数据在您需要它的整个持续时间内仍然存在。
因此,唯一可靠存储数据的方法是使用持久存储技术,即要么使用 SharedPreferences 机制,要么使用内容提供者(由持久存储上的数据库支持)或直接将数据存储到文件中。我想你能做的最好的就是将数据存储在加密的文件系统上。但是,这会给您带来另一个问题:如何(安全地)存储加密密钥。但您或许可以使用 Android 密钥库充分解决该问题(请参阅 here 和 here)。
【讨论】:
以上是关于从另一个上下文向 HostApduService 传递信息的主要内容,如果未能解决你的问题,请参考以下文章
如何用简单的英语解释回调?它们与从另一个函数调用一个函数有何不同?
NSArrayController 没有拾取从另一个上下文合并的数据