본문 바로가기

ANDROID/Bluetooth

[안드로이드] 다중 블루투스 연결 Application 클래스에서 해결하기

기본적으로 한 앱에서 블루투스 소켓을 생성할 때에 들어가는 시간이 있는데, 


한개의 기기와의 통신을 수행할 때에는 크게 고려할 정도가 아닌 딜레이지만


세 개 이상의 기기와 소켓을 생성하여 통신을 수행할 때에 소켓을 open하는데 걸리는 시간은 


눈에 띄게 배로 증가하게 된다.



우선 액티비티 내부에서 이런 작업들을 수행할 경우, 다음 액티비티로 넘어갈 때 이전 액티비티에서 소켓을 클로징해주지


않으면 잡을 수 없어 오픈과 클로징을 반복해야만 하는 번거로운 과정과 타임 딜레이가 생기는 상황이었다.



이를 해결하기 위해 액티비티들과 독립되 독자적으로 존재하는 Application 클래스가 생각이 났고,


여기에서 블루투스 소켓 통신을 유지하면 되지 않을까 하는 아이디어를 가지고 서치를 조금 했다.




아니나다를까 그런 사례들이 몇몇 보이는 걸 보았고, 실적용까지 마쳐 반복적인 소켓 오픈클로징을 제거할 수 있는 수준이 되었다.



과정은 대충 아래처럼 된다.



1. 사용할 Application 클래스를 생성하고 필요한 환경들을 조성한다. 


클래스 생성 > 매니페스트 name에 추가



2. 참조할 블루투스 소켓들과 최초 연결에 필요한 과정들을 Application 클래스 내부에 선언한다.


- 블루투스 소켓 x n

- 블루투스 MAC 주소(혹은 Search 메소드 등)

- 연결에 필요한 UUID

- n개의 소켓에 수행할 n개의 connect 메소드 



3. 블루투스 연결을 수행하고 이용할 액티비티에서 Application 클래스를 가져온다.



4. Getter를 활용해 블루투스 소켓을 가져오고, 연결과 Parser 생성등의 과정을 수행한다.


여기서 만약 앱에서 반복수행을 필요로 하는 경우(액티비티로 다시 돌아와야 할 경우)

소켓의 생성 여부(null인지 확인)와 연결상태 확인(isConnected())을 이용해

반복 작업을 간단히 스킵할 수 있음



5. 이 과정을 마치면 액티비티의 생성과 소멸에 상관없이 소켓유지 및 통신을 유지하는 앱의 모습을 감상할 수 있다.


반면 연결이 계속 유지될 때의 일어날 수 있는 상황을 잘 핸들링 할 수 있도록 하자.


  






< 참조 >


- http://arabiannight.tistory.com/entry/304


- https://stackoverflow.com/questions/17568470/holding-android-bluetooth-connection-through-multiple-activities