0

현재 Android HCE 애플리케이션을 개발 중입니다. 내 HCE service 리더 장치에서 APDUs 걸립니다. 리더 장치가 계속해서 전송합니다. 따라서 내 HCE serviceprocessCommandApdu()이 꽤 자주 호출됩니다. 대부분 READER_STATE_APDU이옵니다. 이것은 독점적 인 apdu이며 독자 장치와 내 안드로이드 HCE service에 의해서만 인식됩니다. 여기에는 독자 및 특정 MESSAGE 바이트에 대한 정보가 포함되어 있습니다. 대부분 MESSAGE 바이트는 0x00 메시지가 없음을 의미합니다. 그러나 때로는 어떤 사건을 나타냅니다. 오류이거나 다른 것일 수 있습니다. 내 HCE service은 응답 APDU에서 MESSAGE 바이트를 확인해야합니다. 그리고 리더 디바이스는 HCE service에서 응답 APDU를받을 때 MESSAGE 바이트를 지 웁니다.Android HCE 애플리케이션 아키텍처

내 생각은 READER_STATE_APDUprocessCommandApdu() 방법으로 구문 분석하고 해당 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과 나는 몇 시간 동안 사용자에게 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 (의사)에서

가 :

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

그러나이 솔루션은 신뢰할 수없는 것으로 보인다

그래서 난 내 HCE service (의사)에서 다음 코드를 상상할 수 .

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가 생성되고 전송 및 전달됩니다에는 보증이 없다 : 나는, 예를 들어, 내 HCE service 레크리에이션을 통해 (의사를) mStartReaderActivity을 유지 SharedPreferences를 사용할 수 있습니다. 예를 들어 사용자가 버튼을 누르기 전에 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'을 받았고 set (prefs에 저장) 플래그를 가지고 있습니다. 그러면 'ErrorActivity'가 시작되어 사용자에게 표시됩니다. 그런 다음 Android가 프로세스를 종료하고 사용자가 버튼을 누르지 않으면 플래그가 지워지지 않습니다. 그런 다음 'HCE service'가 다시 시작되고 기본 설정에서 플래그를 읽습니다. 지금 깃발은 항상'ReaderActivity'가 시작되지 않아야 함을 나타냅니다. – fighter0ik

+0

당신은 onDestroy를 무시할 수 있습니다. 유용 할 경우 – LaurentY

+0

@ fighter0ik를 업데이트했습니다. 응답을 받아주세요. – LaurentY

관련 문제