프로그램/안드로이드

Android 에서, 문자 발송 성공/실패 처리.

(주)CKBcorp., 2014. 8. 13. 05:00
반응형



일반적으로 Android 에서 문자( SMS )를 전송할 때는 SMS 객체를 쓴다. 대충 코드로 설명하면



android.telephony.SmsManager sms = android.telephony.SmsManager.getDefault();

sms.sendTextMessage( 상대방전번문자열, null, 보낼문자문자열, sentPI, deliverPI ); 



뭐 이런식인데 ( 자세한건 "안드로이드 SMS객체" 나 위의 함수로 검색하면 예제 다 나온다 )


안드로이드에서 문자를 전송하기 위해서는, 일종의 callback 함수를 등록해 줘야 한다.


문자 전송이 비동기( 정확하게는 Pending - Intent ) 로 이루어지다 보니, 전송 결과를 처리할 함수 - OnSMSSendSuccess(), OnSMSSendFail() 쯤 되는 - 를 , 등록해서 처리해야 한다.


즉, 문자는 위의 SendTextMessage() 함수로 OS 에 "던져" 놓고 ( Intent 를 통해서 ) 

실패던 성공이던 결과가 날라오기를 하염없이 기둘려야 한다는 것.( 정확하게는 등록한 성공/실패함수가 실행되는 걸 기둘려야 한다는 뜻 )


그렇기에, 당연히 비동기 함수 실행 문제도 발생하고,

각 성공/실패 함수간에 인자값 전달 문제도 발생한다. ( 안드로이드 SMS 객체 함수를 봐도, 인자를 던져주는 방법이 안보인다.)



[ 딱 이런 느낌. ]


이 내용이 의미하는 공포는 프로그램 짜는 사람은 모두 알거다.

함수를 실컷 객체 중심으로 짜다가, 갑자기 Javascript 처럼 스크립트 함수 짜는 느낌. 돌아버린다.


뭐 그게 중요한 게 아니고.... 그래서 결국 "두 건 이상의 SMS 를 프로그램으로 보낼 때, 각각 문자의 성공 실패를 어떻게 구별하는가 " 가 이야기하려는 건데, 방법은 이러하다.


1. 단지 문자(SMS) "발송" 만 할 거고, 발송 성공/실패 따위는 안 볼 거라면( 어짜피 같은 폰에서 보내는 거라서, 실패할 가능성은 거의 없다. 개미 똥구녘 방귀 정도) , 그냥 SMS.SendTextMessage() 가 전송 갯수만큼 실행 완료 했을 때 사용자에게 전송 성공이라고 알려주면 된다. 속 편한 방법.


2. 각각의 SMS 에 대해 성공 / 실패를 일일이 확인하려고 할 때 문제가 되는데, 이 경우는 답이 없다. 코드 더러워 지는건 각오해야함.


2.1. 당연히 OnSuccess() , OnFail()에 해당하는 함수를 준비 + 등록한다. 

2.2. 전역변수( T_T ) 에 "sms 전송 시작 / 성공 / 실패 Status " 변수를 준비한다.

2.3. SendTextMessage() 를 통해 SMS를 전송할 때, 우르르 쏟아부어 한꺼번에 모두 전송하지 말고, 단 한 건만 전송한다.

2.4. 전송 후, 전역 sms 전송 상태 변수를 "전송시작" 으로 변경.

2.5. Thread로 ( -_-;; ) 전역 sms 상태 변수를 감시. 

2.6. onSuccess() 혹은 onFail() 이 call 되었다면, 전역 sms 상태 변수를 "성공" 혹은 "실패" 로 바꾼다.

2.7. 2.4. 의 Thread 에서 상태 변수가 "성공" 혹은 "실패" 로 바뀌면, 전송할 문자 전체의 전송 결과를 관리하는 객체/배열/뭐든간에, 해당 문자의 상태를 업뎃해 준다.

2.8. 이 짓을, 전송하려는 복수개의 문자 뭉텅이 모두에게 적용한다.

2.9. 마지막 문자의 전송 성공 / 실패를 확인하고 나면, 전송 결과를 사용자에게 알려준다.



이 방법의 나쁜점은 수도없이 많지만, 그 중에 하나가 반응성이 더럽게 나빠진다는 거다. 딱 보면 알겠지만, event driven 을 순차처리 비스무리하게 바꾼거라서, 느리다. 



더 쓰고 싶지도 않다. 이상 끝.



 


반응형