안녕하세요 이제 막 개발을 시작했는데 소켓 통신을 백그라운드에서도 했으면 좋겠어서 공부 중입니다.
앱을 종료하더라도 소켓 통신이 유지되어 나중에 특정 값을 수신하면 문자를 발송하게끔하기위해 포그라운드 서비스로 백그라운드 작업을 진행했습니다.
소켓 통신을 하는 스레드를 서비스가 시작될때 시작시키고, 서비스가 종료되면 소켓을 닫았다가 다시 스레드를 시작시켜서 계속 돌아가게 작성하였습니다.
화면 구성은 메인 엑티비티에서 A와 B엑티비티로 넘어가는 버튼을 볼 수 있고 버튼을 누르면 해당 엑티비티로 이동을 하게끔 구성하였습니다.
메인엑티비티에서 포그라운드 서비스를 startService로 시작시켜 소켓 통신을 동작시키고 발생 값을 바인드 서비스로 받아서 A와 B엑티비티에 해당 값을 처리해 화면에 보여주고 싶습니다.
문제는 처음 메인엑티비티에 접속했을때는 소켓 통신이 잘되는데 뒤로가기나 다른 엑티비티를 갔다가 오면 소켓 통신이 불안정해집니다. 거의 끊기는 것 같습니다.
서비스는 앱과 별도로 작동해 엑티비티가 전환되어도 계속 동작해야하는거 아닌가요?
소켓 통신도 안끊기고 계속 되어야하는데 재접속시에 접속이 거의 끊기는 이유가 뭘까요? ㅠㅠ
알려주신다면 감사하겠습니다 ㅠ
- 소켓 통신 스레드 run함수에 소켓 연결 부분입니다.
public void run(){
while(GATE_FLAG){
try{
socclient = new Socket();
InetSocketAddress socketAddress = new InetSocketAddress(InetAddress.getByName(config.getGateway()),config.getPort3());
socclient.connect(socketAddress,350);
if(socclient.isConnected()){
Log.e("소켓", "연결");
socclient.setTcpNoDelay(true); //에러 null
out = new PrintWriter(socclient.getOutputStream(), true); //에러 Socket is not connected
out.write(GATEWAY_ORDER + "");
out.flush();
- 서비스 종료시
@Override
public void onDestroy() {
super.onDestroy();
if(socclient !=null) {
try {
socclient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
synchronized (this) {
this.GATE_FLAG = false;
}
//핸들러 멈춤
GT_handler.removeMessages(0);
thread.interrupt();
//스레드 다시 동작
thread = new GATEWAY();
thread.start();
}