[英]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
而卡住。
有什么辦法可以解決嗎?
還是應該改變架構? 例如,我是否應該將一個Activity
與Fragments
一起使用,並通過savedINstanceState
在Activity
保留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.