我目前正在开发android应用程序。我的HCE service从读取器中获取APDU。阅读器设备不断地发送它们。因此,我的HCE service中的HCE service经常被调用。大多数时候,READER_STATE_APDU都会来。这是一个专有的apdu,只有阅读器设备和我的android HCE service才能识别。它包含一些有关读取器和特殊MESSAGE字节的信息。大多数情况下,MESSAGE字节是0x00,这意味着没有消息。但有时它预示着某种事件。这可能是个错误或者别的什么。我的HCE service必须确认MESSAGE字节以响应APDU。当从我的MESSAGE接收到响应APDU时,读取器设备清除HCE service字节。
现在我的想法是在processCommandApdu()方法中解析processCommandApdu()并向用户显示相应的Activity。
例如,当MESSAGE字节为0x00时,我希望启动ReaderActivity来向用户显示读者的信息。当MESSAGE字节是SOME_ERROR时,我希望启动ErrorActivity以向用户显示错误。
所以我的processCommandApdu()可能就像这个processCommandApdu()
public byte[] processCommandApdu( byte[] commandApdu, Bundle extras )
{
...
if commandApdu is READER_STATE_APDU
{
if messageByte is NO_MESSAGE
{
create intent for ReaderActivity and start it
}
else if messageByte is SOME_ERROR
{
create intent for ErrorActivity and start it
}
...
}
...
}当然,这些活动应该有相应的发射模式或标志。
但是,正如我前面所说的,MESSAGE字节只是一个事务的SOME_ERROR,我希望在一段时间内向用户显示ErrorActivity,并防止ReaderActivity被启动。
所以我可以想象在我的(pseudocode):HCE service中下面的代码
boolean mStartReaderActivity;
...
public byte[] processCommandApdu( byte[] commandApdu, Bundle extras )
{
...
if commandApdu is READER_STATE_APDU
{
if messageByte is NO_MESSAGE
{
if ( mStartReaderActivity )
{
create intent for ReaderActivity and start it
}
}
else if messageByte is SOME_ERROR
{
if ( mStartReaderActivity )
{
mStartReaderActivity = false;
}
create intent for ErrorActivity and start it
}
...
}
...
}
...
public int onStartCommand( Intent intent, int flags, int startId )
{
if intent is INTENT_ERROR_CONFIRMED
{
mStartReaderActivity = true;
}
}在我的(pseudocode):ErrorActivity里
public void onConfirmErrorButtonClick()
{
create INTENT_ERROR_CONFIRMED and start service
}但这个解决方案似乎不可靠。例如,我可以使用SharedPreferences在我的HCE service娱乐SharedPreferences中保留mStartReaderActivity。
boolean mStartReaderActivity;
...
public void onCreate()
{
...
loadStartActivityFromPreferences();
...
}
public byte[] processCommandApdu( byte[] commandApdu, Bundle extras )
{
...
if commandApdu is READER_STATE_APDU
{
if messageByte is NO_MESSAGE
{
if ( mStartReaderActivity )
{
create intent for ReaderActivity and start it
}
}
else if messageByte is SOME_ERROR
{
if ( mStartReaderActivity )
{
mStartReaderActivity = false;
saveStartActivityToPreferences();
}
create intent for ErrorActivity and start it
}
...
}
...
}
...
public int onStartCommand( Intent intent, int flags, int startId )
{
if intent is INTENT_ERROR_CONFIRMED
{
mStartReaderActivity = true;
saveStartActivityToPreferences();
}
}但是没有保证INTENT_ERROR_CONFIRMED将被创建、发送和交付。例如,Android可以在用户按下按钮之前关闭进程。因此,HCE service可能会坚持使用mStartReaderActivity==false。
有办法处理吗?
或者我应该改变一下建筑?例如,我是否应该将一个Activity与Fragments一起使用,并通过savedINstanceState在Activity中保留mStartReaderActivity (well, mShowReaderFragment in new terms)
或者其他的解决方案?
发布于 2016-06-30 16:14:08
我不确定您到底想要什么,但是如果您想要显示ErrorActivity,直到用户单击按钮。
HCE服务器(它是伪代码):
public byte[] processCommandApdu( byte[] commandApdu, Bundle extras )
{
if commandApdu is READER_STATE_APDU {
if messageByte is NO_MESSAGE {
if(SharedPrefs 'inError != true'){
create intent for ReaderActivity and start it
}
} else if messageByte is SOME_ERROR {
save 'inError = true + errorMessage=myerror' in SharedPref
create intent for ErrorActivity and start it
}
}
}
@Override
public void onDestroy() {
// set error to false
SharedPrefs 'inError = false'
}在ErrorActivity中(它是伪代码)
//click on button acknowledge
public void clickAcknowledgeError(View v){
save 'inError = false'
}https://stackoverflow.com/questions/38124555
复制相似问题