首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android HCE应用体系结构

Android HCE应用体系结构
EN

Stack Overflow用户
提问于 2016-06-30 13:27:43
回答 1查看 263关注 0票数 0

我目前正在开发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()

代码语言:javascript
复制
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中下面的代码

代码语言:javascript
复制
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

代码语言:javascript
复制
public void onConfirmErrorButtonClick()
{
    create INTENT_ERROR_CONFIRMED and start service
}

但这个解决方案似乎不可靠。例如,我可以使用SharedPreferences在我的HCE service娱乐SharedPreferences中保留mStartReaderActivity

代码语言:javascript
复制
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

有办法处理吗?

或者我应该改变一下建筑?例如,我是否应该将一个ActivityFragments一起使用,并通过savedINstanceStateActivity中保留mStartReaderActivity (well, mShowReaderFragment in new terms)

或者其他的解决方案?

EN

回答 1

Stack Overflow用户

发布于 2016-06-30 16:14:08

我不确定您到底想要什么,但是如果您想要显示ErrorActivity,直到用户单击按钮。

HCE服务器(它是伪代码):

代码语言:javascript
复制
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中(它是伪代码)

代码语言:javascript
复制
//click on button acknowledge
public void clickAcknowledgeError(View v){
    save 'inError = false'
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38124555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档