저번 포스팅에 이어서 정리하도록 하겠다.
# 알게 된 것
-- 👇 이번 포스팅 👇--
- 액티비티 생명주기 ( Activity LifeCycle)
-- 👇 다음 포스팅 👇--
- 파일(이미지) 접근 권한 얻기
- Content Provider
- 사진첩에서 선택한 이미지 액티비티로 보내기
# 액티비티 생명주기, Activity LifeCycle
## 생명주기란 ?
생명주기라는 단어를 처음 접하게 된 것은, 리액트를 공부할때 였다. 이 개념 자체가 매우 생소했었는데 찾아보게 되면서 정말 꼭 필요한 개념이구나하고 느꼈었다. 그리고 안드로이드를 공부하면서 똑같은 용어를 또 마주치게 됐다. 그래서인지 이번에는 생소하기보다는 어떤 생명주기를 가질까하는 생각이 먼저 들었다. 간단히 생명주기를 이야기 해보자면, 한 프로그램이 만들어지고 시작되고 없어지는 일련의 과정이다. 안드로이드에서는 액티비티별로 생명주기를 가지게 된다. 우리가 만드는 MainActivity와 같은 이 액티비티들이 독립적인 생명주기를 가지며 생겼다가 없어졌다가를 반복한다.
## 어떻게 활용해야 할까?
사실 안드로이드에서 생명주기를 이용해 본것은 처음이었다. 이용했다라기보다는, 생명주기를 위한 예제라고 봐도 무방하다. 지금껏 onCreate{ ... } 모든 코드를 작성하면서 이게 맞는걸까라는 의문이 첫번째였다. 그래서 이번을 계기로 생명주기를 테스트해봤다.
### 문제점 1
생명주기를 신경쓰지 않고 onCreate{ ... } 에서만 timer를 켜줬다. timer는 1초마다 특정일을 수행하는데, 수행될때마다 로그가 찍히도록 해봤다.
다음과 같이 액티비티가 Stop인 상태인데도 불구하고, 계속해서 타이머가 돌고있다. 현재 Stop은 내가 홈버튼을 눌러서 발생시켰다. 불피요한 작업을 하고 있는 것이다. 이제 해결책으로 onStop에 해당 timer를 종료시켜보도록 하겠다.
### 문제점 2
override fun onStop() {
super.onStop()
Log.d(tag,"start onStop()")
timer.cancel()
}
timer를 종료시켰다. 이제 모든게 해결될 것이라고 예상했지만 생각치 못했던 것이 있었다. 홈버튼(onStop)을 누르고, 다시 Album앱을 열게 되면 timer가 동작하지 않는다. 생명주기를 다시 생각해보면 onStop -> onRestart -> onStart 으로 다시 시작하게 된다. 그러나 onCreate는 onStart전에 동작하는데 이렇게 될경우 onCreate가 실행되지 않기때문에 timer가 다시 시작되지 않는다.
### 해결하기
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_photoframe)
Log.d(tag,"start onCreate()")
// startTimer()를 실행하면 중복실행 됨
}
override fun onStart() {
super.onStart()
Log.d(tag,"start onStart()")
startTimer()
}
override fun onResume() {
super.onResume()
Log.d(tag,"start onResume()")
}
override fun onPause() {
super.onPause()
Log.d(tag,"start onPause()")
}
override fun onStop() {
super.onStop()
Log.d(tag,"start onStop()")
timer.cancel()
}
override fun onDestroy() {
super.onDestroy()
Log.d(tag,"start onDestory()")
timer.cancel()
}
이렇게 생명주기를 작성하고, 루프를 돌면서 반복적으로 확인하는 작업이 있다면 올바른 곳에서 생명주기를 시작해주고, 종료시켜줘야할 거 같다. 그렇지 않으면 백그라운드에 갔다가 다시 접속하게 될 경우 아무것도 동작하지 않는 바보 앱이 될 것이 뻔하다.
반대로 백그라운드 상태에서도 추가파일을 다운받아야하는 상황이라면 생명주기를 적극 활용하여 해당 쓰레드가 종료되는 것을 막는것도 좋은 방법일거 같다.
다음은 이미지 접근 방법에 대해서 정리하도록 하겠다.