現在、アンドロイドHCEアプリケーションを開発中です。私のHCE service
はリーダーデバイスからAPDUを受け取ります。リーダー装置はそれらを連続して送信する。だから私のHCE service
のprocessCommandApdu()
がかなり頻繁に呼び出されます。ほとんどの場合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 service
はmStartReaderActivity==false
と付き合うことがあります。
これに対処する方法はありますか?
アーキテクチャを変更する必要はありますか?たとえば、Activity
とFragments
を使用し、mStartReaderActivity (well, mShowReaderFragment in new terms)
をActivity
でsavedINstanceState
に保持する必要がありますか?
他の解決策ですか?
感謝。しかし、あなたのソリューションは私のものと似ていると思います(私の質問で 'saveStartActivityToPreferences()'と 'loadStartActivityFromPreferences()'を見てください)、そうであれば動作しません。たとえば、 'HCE service'は' ERROR'を取得し、フラグを設定して保存します。そして、 'ErrorActivity'が開始され、ユーザーに示されました。 Androidはプロセスを終了し、ユーザーはボタンを押さず、そうであればフラグはクリアされません。その後、 'HCE service'が再起動され、プリファレンスからフラグが読み込まれます。今、フラグがなかれ 'ReaderActivity'あなたはonDestroyをオーバーライドすることができ – fighter0ik
開始すべきではないことを示し、それは便利だ場合、私はfighter0ik @私の答え – LaurentY
を更新することは、私は長い間、私の不在のために本当にごめんなさい答え – LaurentY