728x90
반응형

안녕하세요.

이번 프로젝트 관련해서 서비스와 클라이언트간의 통신시 서비스가 종료 되면 다시 재 실행이 되고 클라이언트는 서비스와의 연결을 유지 해야 합니다.

 

원치 않게 연결이 끊길 때 클라이언트가 자동으로 서비스와 다시 연결을 시도 해야 합니다.

여러가지 방법이 있을 수 있겠지만 intent로 처리하는 방법을 사용 하였습니다.

728x90

Service

 //서비스가 재 실행 되었을 때 해당 intent를 client에게 전달 한다.
private fun sendRestartService() {
    val intent = Intent("com.example.restartService")
    sendBroadcast(intent)
    Log.i(TAG, "sendRestartService!")
}

//sendRestartService를 호출 하는 부분
class MyService: Service() {
	override fun onCreate() {
    	sendRestartService()
    }
}

물론 위 서비스 말고 Activity에서 하고 싶은 경우는 MainActivity에서 하면 됩니다.

 

 

Client

class MainActivity {
	override fun onCreate() {
    	connectService()	//서비스 연결
        registerReceiver(connectionReceiver, IntentFilter("com.example.restartService"),
            RECEIVER_NOT_EXPORTED
        )
    }
    
    private val connectionReceiver = object: BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            Log.i(TAG, "onReceive")

            //서비스가 재 실행이 되면 intent로 해당 action값을 보내서 있는 경우 현재 클라이언트에게 알려주며
            //맞는 action값이 들어오면 서비스에게 다시 연결을 시도 한다.
            if (intent?.action.equals("com.example.restartService")) {
                Log.i(TAG, "서비스가 재시작되었음.")
                connectService() 서비스 연결
            }
        }
    }
}

클라이언트에서의 설정입니다.

기본적으로 서비스가 시작되어 있는 상태에서 클라이언트가 실행 되었을 때 자동으로 서비스 연결을 시도하고

intent값을 등록 합니다.

이후 서비스가 종료 후 다시 시작 되면 서비스에서 com.example.restartService 라는 action값을 보내게 되고 해당 값을 수신 받으면 서비스가 재시작됨을 알 수 있고 클라이언트는 서비스에게 다시 연결을 시도 합니다.

 

로그를 볼까요?

서비스가 종료되어 연결이 끊어진 후 서비스가 재시작된 후에 클라이언트에게 재시작 intent를 보냄.

이후 클라이언트는 해당 메세지를 수신하고 다시 서비스와의 연결을 시도 한다.

반응형

 

위 방법으로 우선 처리를 하였고. 그전에는 타이머로 와치독 방식으로 할까도 생각 했지만 이게 가장 적절한 방법이 아니었나 싶습니다.

 

혹시 또 좋은 방법이 있으면 댓글 환영합니다

 

감사합니다

728x90

+ Recent posts