在我的Android应用程序中,我实现了HostApduService
。这里是它的一部分实现代码:
public final class MyHostApduService extends HostApduService {
private boolean disconnected = false;
@Override
public byte[] processCommandApdu(byte[] commandApdu, @Nullable Bundle extras) {
//process apdu in a background thread and call sendResponseApdu() when ready
Single.fromCallable(() -> processInternal(commandApdu))
.subscribeOn(nfcScheduler)
.subscribe(this::sendResponseApdu, t -> Log.e("could not create response", t));
return null;
}
...
@Override
public void onDeactivated(int reason) {
disconnected = true;
}
private void processInternal(byte[] apdu) {
//business logic
if(!disconnected) {
//last message was probably received by the terminal
}
}
}
根据我的观察,即使在 processCommandApdu()
的过程中,onDeactivated()
回调也可能会立即到来,甚至在此之前,操作系统似乎已经意识到 NFC 场强的降低。
以下是通讯期间场强降低的示例:
16:21:16.808 I/MyHostApduService : processApdu[request|13bytes] 0A4040007A000000004306000
16:21:16.811 D/MyHostApduService : do business logic
16:21:16.890 D/HostEmulationManager: notifyHostEmulationDeactivated
16:21:16.890 D/HostEmulationManager: Unbinding from service ComponentInfo{app.debug/internal.MyHostApduService}
16:21:16.890 I/MyHostApduService : onDeactivated LINK_LOSS
16:21:16.898 I/MyHostApduService : processApdu[response|2bytes|90ms] 6A82
问题在于我需要自信地检查最后一条消息是否已被接收或丢弃,因为某些重要的完成代码必须执行(但仅当终端接收到该消息时才执行)。有没有更好的方法来检查消息是否已接收,而不是使用
onDeactivated()
(它在时间上似乎非常不确定)?