簡體   English   中英

Android HCE應用程序架構

[英]Android HCE application architecture

我目前正在開發android HCE應用程序。 我的HCE service從讀取器設備獲取APDU。 讀取器設備連續發送它們。 因此,我的HCE service processCommandApdu()經常被調用。 大部分時間READER_STATE_APDU都會到來。 這是專有的apdu,只能由閱讀器設備和我的android HCE service識別。 它包含有關閱讀器和特殊MESSAGE字節的MESSAGE 大多數情況下, MESSAGE字節為0x00,這意味着沒有消息。 但有時它表示某些事件。 可能是錯誤或其他原因。 我的HCE service必須確認響應APDU中的MESSAGE字節。 當從我的HCE service接收到響應APDU時,讀取器設備將清除MESSAGE字節。

現在,我的想法是在processCommandApdu()方法中解析READER_STATE_APDU並向用戶顯示相應的Activity

例如,當MESSAGE字節為0x00時,我想啟動ReaderActivity向用戶顯示讀者的信息。 MESSAGE字節為SOME_ERROR我想啟動ErrorActivity向用戶顯示錯誤。

所以我的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 ,我想在一段時間ReaderActivity用戶顯示ErrorActivity並阻止啟動ReaderActivity

所以我可以想象我的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;
    }
}

在我的ErrorActivity偽代碼 )中:

public void onConfirmErrorButtonClick()
{
    create INTENT_ERROR_CONFIRMED and start service
}

但是這種解決方案似乎是不可靠的。 例如,我可以使用SharedPreferences在我的HCE service重新創建過程中保留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而卡住。

有什么辦法可以解決嗎?

還是應該改變架構? 例如,我是否應該將一個ActivityFragments一起使用,並通過savedINstanceStateActivity保留mStartReaderActivity (well, mShowReaderFragment in new terms)

還是其他解決方案?

我不確定您到底想要什么,但是如果您想顯示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'
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM