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

포그라운드 서비스에서 소켓 통신 유지, 재접속시 통신 불안정

0 추천

안녕하세요 이제 막 개발을 시작했는데 소켓 통신을 백그라운드에서도 했으면 좋겠어서 공부 중입니다.

앱을 종료하더라도 소켓 통신이 유지되어 나중에 특정 값을 수신하면 문자를 발송하게끔하기위해 포그라운드 서비스로 백그라운드 작업을 진행했습니다. 

소켓 통신을 하는 스레드를 서비스가 시작될때 시작시키고, 서비스가 종료되면 소켓을 닫았다가 다시 스레드를 시작시켜서 계속 돌아가게 작성하였습니다. 

화면 구성은 메인 엑티비티에서 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();
}

 

 

랄라룽 (380 포인트) 님이 2021년 7월 20일 질문

1개의 답변

0 추천
 
채택된 답변

간략하게 안드로이드 시스템에서 말하는 background service의 정의에 대해 개발자 문서에 이렇게 나와있습니다.(https://developer.android.com/guide/background)

Definition of background work

An app is considered to be running in the background as long as each of the following conditions are satisfied:

  1. None of the app's activities are currently visible to the user.
  2. The app isn't running any foreground services that started while an activity from the app was visible to the user.

Otherwise, the app is considered to be running in the foreground.

즉, 님의 경우는 포그라운드 서비스를 액티비티에서 실행시키고 있다고 하셨으므로, 2번 사항에 대해 충족하지 못하는 걸로 보이기 때문에 foreground 서비스로 간주되겠고 님이 겪는 문제도 발생할 수 있을 것 같네요.

spark (224,800 포인트) 님이 2021년 7월 20일 답변
랄라룽님이 2021년 7월 21일 채택됨
답변 감사합니다.
왜 표시가 안되는지에 대한 이유를 알것 같습니다.
...