0

現在、アンドロイドHCEアプリケーションを開発中です。私のHCE serviceはリーダーデバイスからAPDUを受け取ります。リーダー装置はそれらを連続して送信する。だから私のHCE serviceprocessCommandApdu()がかなり頻繁に呼び出されます。ほとんどの場合READER_STATE_APDUが来ます。これは専用アプリです。リーダーデバイスと私のアンドロイドHCE serviceによってのみ認識されます。それは読者と特別なMESSAGEバイトに関するいくつかの情報を含んでいます。ほとんどの場合MESSAGEバイトは0x00で、何もメッセージがないことを意味します。しかし時にはそれは何らかの出来事を示します。それはエラーか何か他のものかもしれません。私のHCE serviceは、応答APDUでMESSAGEバイトを確認する必要があります。そして、私のHCE serviceから応答APDUを受け取ったとき、リーダーデバイスはMESSAGEバイトをクリアします。Android HCEアプリケーションアーキテクチャ

私の考えは、の方法で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バイトが1つのトランザクションのみのためSOME_ERRORであると私はいくつかの時間のためにユーザーにErrorActivityを示し、開始されることからReaderActivityを防ぎたいです。

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擬似コード)中:

だから、私はHCE service擬似コード)に次のコードを想像することができます

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

しかし、このソリューションは、信頼できないように思われます。私は、例えば、私のHCE serviceレクリエーション(擬似コード)を越えmStartReaderActivityを保持するためにSharedPreferencesを使用することができます。

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 servicemStartReaderActivity==falseと付き合うことがあります。

これに対処する方法はありますか?

アーキテクチャを変更する必要はありますか?たとえば、ActivityFragmentsを使用し、mStartReaderActivity (well, mShowReaderFragment in new terms)ActivitysavedINstanceStateに保持する必要がありますか?

他の解決策ですか?

答えて

0

私はあなたが正確に何をしたいについてはよく分からないが、あなたはユーザーがボタンをクリックするまでErrorActivityを表示したい場合。

HCEサーバー(これの擬似コード):ErrorActivity(それの擬似コード)で

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' 
} 

たくさんの回答のため

//click on button acknowledge 
public void clickAcknowledgeError(View v){ 
    save 'inError = false' 
} 
+0

感謝。しかし、あなたのソリューションは私のものと似ていると思います(私の質問で 'saveStartActivityToPreferences()'と 'loadStartActivityFromPreferences()'を見てください)、そうであれば動作しません。たとえば、 'HCE service'は' ERROR'を取得し、フラグを設定して保存します。そして、 'ErrorActivity'が開始され、ユーザーに示されました。 Androidはプロセスを終了し、ユーザーはボタンを押さず、そうであればフラグはクリアされません。その後、 'HCE service'が再起動され、プリファレンスからフラグが読み込まれます。今、フラグがなかれ 'ReaderActivity'あなたはonDestroyをオーバーライドすることができ – fighter0ik

+0

開始すべきではないことを示し、それは便利だ場合、私はfighter0ik @私の答え – LaurentY

+0

を更新することは、私は長い間、私の不在のために本当にごめんなさい答え – LaurentY

関連する問題