제이슨의 개발이야기
Service 컴포넌트 onTaskRemoved(rootIntent: Intent?) 앱을 강제종료 시켰을 때 본문
해당 글은 작성자 가 스스로 고민하고 공부해서 쓴 내용이므로 해당 내용이 잘못된 내용일 수도 있습니다!
혹시 잘못된 정보가 있는 경우 댓글로 피드백 주시면 너무 감사합니다!
안녕하세요! 오늘은 조금 어려운 내용에 대해서 이야기 해보고자 합니다!
보통 앱을 사용하다보면 정상적으로 앱 내에서 종료하는 방법도 있지만 보통
이런 화면에서 손가락을 위로 올려서 앱을 종료하는 방법도 있습니다
그러나 이렇게 종료하는 경우에 앱이 종료될때 필요한 로직이 제대로 실행되지 않은 경우가 있습니다
보통 우리는 각 뷰의 라이프 사이클이 존재하는것을 알고 있기때문에 라이프 사이클에 맞춰서 필요한 부분에 필요한 로직을 작성 하면 되겠지? 란 생각을 하지만 실제로 저런 식으로 종료 할 경우 해당 라이프 사이클이 재대로 실행되지 않고 종료합니다!
예를 들면 onDestroy()에 db 접근 해서 데이터를 지우는 로직을 작성 해 놓았지만 해당 로직이 실행되지 않아 db에 필요없는 데이터가 그대로 남아있습니다!
이 문제를 해결하기 위해서는 일단 Service 컴포넌트를 하나 만들어서 start 한 후 앱이 종료될 때 Service 클래스에 있는
onTaskRemoved(rootIntent: Intent?) 메소드를 오버라이딩 하는 방법이 있습니다
onTaskRemoved(rootIntent: Intent?) 메소드는 앱이 종료될때 실행되는 메소드 로 써 onTaskRemoved(rootIntent: Intent?) 메소드가 실행이 종료되면 각 뷰들도 종료가 됩니다 이때 중요한 점은 onDestroy() 가 실행이 아직 끝나지 않더라도 그대로 종료된다는 점입니다!
그래서 onTaskRemoved(rootIntent: Intent?)는 필요에 따라 해당 메소드 안에 필요한 로직을 작성하는 방법이 있습니다!
그러나 저같은 경우 파이어스토어 에 접근해야 하는대 onTaskRemoved(rootIntent: Intent?) 에서는 파이어스토어 접근 실행이 안되는 문제가 있었습니다!
그래서 저는 onTaskRemoved(rootIntent: Intent?) 가 종료되는 시점을 최대 한 늦추면 그 시간 동안 onDestroy() 메소드가 실행을 끝낼 수 있지 않을까? 란 생각을 했습니다
그래서
override fun onTaskRemoved(rootIntent: Intent?) {
println("Thread sleep")
Thread.sleep(5000)
println("꺠어남 스레드")
// super.onTaskRemoved(rootIntent)
stopSelf()
}
5초동안 해당 스레드를 sleep 해놓게 되면
5초동안 onTaskRemoved 메소드가 종료되지 않기 때문에
그때
override fun onDetach() {
var db = FirebaseFirestore.getInstance()
db.collection("cities")
.document("test4")
.delete()
db.collection("cities")
.document("test5")
.delete()
db.collection("cities")
.document("test")
.delete()
db.collection("cities")
.document("test2")
.delete()
db.collection("cities")
.document("test3")
.delete()
super.onDetach()
}
파이어스토어에 지우고자 하는 데이터를 지웁니다!
참고로 저는 Activity 가 아닌 Fragment 가 종료될때 로직이 발생해야 되서 Fragment 생명주기 에서 onDetach() 메소드를 오버라이딩 했습니다!
사실 이 방법은 임시방편이고 그다지 좋은 방법은 아니라고 생각합니다
가장 좋은 것은 서버 자체적으로 해당 유저가 앱이 종료되는 시점을 파악해서 데이터를 지우는 방식이 가장 좋은 방식이라고 생각합니다
그러나 현재 수준에서 서버에서 파악하고 해결하는 방식을 구현하기 어렵다면 제가 오늘 이야기 한 방식을 적용해서 구현 하는 것도 임시방편으로 나쁘지 않다고 생각합니다!
그리고 앞서 서두에 이야기 한 것처럼 해당 글은 작성자 본인이 고민하고 테스트 하고 쓴 글로 써 해당 방식이 잘못된 방식 일 수도 있고
이 방식보다 더 정상적이고 효율적인 방식이 있을 수 있습니다! 혹시 더 좋은 방식을 알고 게시거나 제가 쓴 내용의 잘못된 점이 있으면 댓글에 피드백 부탁드립니다 ^^
혹시 Service 컴포넌트를 만드는 방법이라든가 Service 컴포넌트 를 시작하는 방법이 궁금하면 아래 링크를 참고해주세요 ㅎㅎ
https://jason-api.tistory.com/16
'안드로이드' 카테고리의 다른 글
안드로이드 앱 포그라운드, 백그라운드 체크 하는 방법 ! 포그라운드,백그라운드 일때 푸시 메시지 다르게 구현 (0) | 2021.08.13 |
---|---|
JSON To Kotlin 플러그인 자동으로 Data Model을 만들자 ! 개발 소요 시간 단축 (0) | 2021.08.10 |
안드로이드 서버 응답을 기다리는 중 화면터치 막는 방법 ! (0) | 2021.07.14 |
ViewPager2 로 양쪽 페이지 살짝 보이게 만들기! (0) | 2021.06.04 |
Firebase RemoteConfig 이용해보기! Android with Coroutin , viewPager2 이용 (1) | 2021.06.03 |