마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

으어..... 화면이 꺼지면 소켓이 데이터를 안받습니다...

0 추천
온갖 실험과 반복 끝에도 도저히 안되서 질문드립니다...

메인 액티비티에서 서비스를 만들고 서비스에서 스레드를 두 개 만들어 데이터를 송, 수신하고 있습니다.

이게 화면이 켜지면 제대로 잘 작동을 합니다.

홈키를 눌러 다른 프로그램을 동작시켜도 제대로 동작합니다.

문제는 화면이 꺼지면 "수신만" 안한다는 것입니다.

두 기기가 일정한 주기로 브로드캐스트로 동기화 신호를 보내고,

두 기기가 각각 자신이 보낸 데이터와 상대방이 보낸 데이터를 받고, 수신 로그를 기록합니다.

이 중 한 기기의 전원버튼을 눌러 슬립상태로 보내버리면,

여전히 켜져있는 기기는 자신이 보낸 데이터와 상대가 보낸 데이터를 계속 받지만,

꺼져 있는 기기는 상대의 데이터를 받지 않고, 자신이 보낸 데이터만 받아서 로그에 쌓습니다.

그러다 다시 키면 둘다 받기 시작하고요.

디버그 모드로 단계별로 확인해도, 자신의 데이터를 수신할때는 socket.recv()를 통과하는데,(즉 스레드는 동작합니다)

상대방이 보낸 데이터는 전혀 반응을 안하고 socket.recv()에서 진행을 안하네요...

 

wifilock, wakelock 모두 acquire 되어있는 상태입니다.

wifi 설정도 화면이 꺼져도 wifi 끄지 않음 으로 설정되어 있고요.

도저히 원인을 모르겠어요.

짐작하기로는 슬립상태가 되면 전원관리 차원에서 socket.recv() 메소드 내부루프를 꺼버리는거 같은데,

이걸 어떻게 해결해야할지 모르겠네요.

전화어플이나 메신져어플 같은 경우도, 화면이 꺼져도 데이터 수신을 하고, notification 해주잖아요.

고수님들 제가 뭔가 한가지를 모르는 것 같은데 그것좀 알려주세요
익명사용자 님이 2013년 11월 6일 질문
2013년 11월 6일 수정

1개의 답변

0 추천
서비스에다가 소켓 구현해보셔요..

메인에다가 쓰레드 따로 만들어서 하지 마시고

서비스 만드신담에 거기에다가 소켓 짜시고

바인드 시켜서 백그라운드에서도 돌아가게 해보시면 될듯한데요??
익명사용자 님이 2013년 11월 6일 답변
서비스 클래스 내에서 소켓을 선언하고, 실제 송수신 등은
서비스 클래스 내에서 정의한 스레드에서 하고 있습니다.
화면이 꺼져도 백그라운드에서 "송신"은 잘되는데 "수신"만 안됩니다.
저도 당최 이해가 안되서 이러고 있습니다.

특정 기기에서는 잘 켜놔도 특정시간이 지나면 역시
송신만 되고 수신이 안되는 경우가 있더군요.
이것도 같은 원인인지 모르겠지만 이 역시 해결이 안되고 있습니다.
이궁 제대로 글도 안 읽어 봤네요 ㅈㅅㅈㅅ 이미 서비스에 구현하셧다니..

음.. PowerManager.PARTIAL_WAKE_LOCK 주셧고..

cpu가 계속 작동하는데.. 으음.. 뭐가 문젤까요..

혹시 WIFI 가 아닌 3G 환경에서도 그런가요?
테스트 환경이 와이파이만 되서 3G는 해보지 못하고 있어요
서비스를 바인드로 활성화시키지 않고 startService()로 해서 그럴까요?
리모트 서비스가 아니라 로컬 서비스라서 그럴까요?
별로 나아질꺼같지는 않은데 이유를 모르겠네요.
카카오톡같은거는 슬립상태에서도 잘만 수신하는데....
혹시 로그를 볼수 있을까요???? 서비스가 죽어서는 아닐꺼 같긴 한데..
저는 예전에 소켓을 서비스에서 짤때 리모트 서비스로 짜서 굴렸을땐 문제가 없었는데.. 음..
서비스에 foreground 걸어 보셔요..  바
이따 들어가서 로그를 찾아볼께요.
제가 기억하기로는 그냥 recv 대기중이라 별다른 오류같은 로그는 찍히진 않았던거같은데
또 다른점은 TCP가 아니라 UDP라는 점도 있어요.
DatagramSocket으로 브로드캐스팅 신호를 받아요.
근데 만약 TCP가 되는데 UDP라고 안되는것도 말이 안되고...
바인드는 안시켰어요. 그냥 onStartService 메소드로 사용했고요.
foreground설정도 이따 들어가서 해볼게요.
감사합니다.
...