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
'프로그래밍 > 안드로이드+코틀린' 카테고리의 다른 글
[Android Studio/안드로이드 스튜디오] AGP에러 임시 해결책. The project is using an incompatible version (AGP 8.6.1) of the Android Gradle plugin. Latest supported version is AGP 8.5.2 (0) | 2024.09.24 |
---|---|
[안드로이드] 레이아웃 - 가이드라인 동적 사용 예제 (with 코틀린) (1) | 2023.11.22 |
[Manifest] 매니페스트 메타데이터 읽어 오기 (0) | 2023.10.31 |
[Layout] Corner radius 적용하기 (0) | 2022.11.15 |
[Kotlin] 랜덤 함수 사용하기. (0) | 2022.11.11 |