액티비티
- 하나의 UI
- 화면에 UI를 표시하는 틀
- View 또는 ViewGroup의 다양한 조합을 화면에 배치하여 UI 표시
- 앱은 하나 이상의 액티비티가 느슨한 결합 형태
액티비티 백스택
- 새 액티비티 생성
- 이전 액티비티 스택에 push
- 새 액티비티 종료로 인해 pop
- 이전 액티비티 다시 표시
특징
- 안드로이드 시스템이 직접 관리
- 안드로이드 시스템에 의해 생성되어 로드되거나 'StartActivity' 함수에 의해 '간접적'으로 띄울 수 있음
액티비티 생명주기
onStart(), onResume()
- 처음 시작 시 실행
- Activity가 가려졌다 돌아올 때도 실행
- 화면의 일부가 가려짐 (ex. 다이얼로그)
- onPause() : 일시정지
- 다른 액티비티로 완전히 전환됨
- onPause() + onStop() : 정지
- 화면의 일부가 가려짐 (ex. 다이얼로그)
- 시스템이 메모리나 배터리 사용량을 줄이기 위해 액티비티를 메모리에서 완전히 제거하기도 함
- 액티비티로 돌아오더라도 다시 onCreate()부터 시작
onPause()
- 생명 주기에서 onPause()가 호출된 상태는 Killable 상태
- Killable 상태 : 언제든지 시스템에서 강제 종료가 가능한 상태
- 강제 종료되면 onStop(), onDestory()가 호출되지 않으므로 onPause()가 마지막 단계
- 임시 데이터는 onPause()의 호출 전인 onSavedInstanceState()에 저장하도록 제공됨
onSavedInstanceState(Bundle outState)
- 액티비티의 동적 상태 데이터(UI 관련)가 저장될 수 있게 onPause() 전에 호출
- 매개변수 Bundle 객체에 저장되어야 할 상태 데이터를 저장
- 이 객체는 액티비티가 재시작될 때, onCreate()와 onRestoreInstanceState()에 전달됨
onRestoreInstanceState(Bundle saveInstanceState)
- 비정상적인 상황(디바이스 회전, 강제 재시작)에만 호출
- 이전 상태 데이터를 포함하는 Bundle 객체를 매개변수로 받음
강제 종료 후 메서드 순서
onCreate() -> onStart() -> onRestoreInstanceState() -> onResume()
onCreate(Bundle SavedInstanceState)에서도 가능하지만 이 메서드를 쓰는 이유는 가끔 모든 초기화 및 레이아웃 전개 후에 복구해야 할 정보들이 있기 때문이다.
onDestroy()
- 액티비티에서 명시적으로 finish()하거나 시스템에 의해 강제적으로 종료될 경우 호출됨
Activity A, B가 있을 경우
- A 실행
A
onCreate
onStart
onResume
- B 실행
A
onPause
onStop
B
onCreate
onStart
onResume
- B가 실행 중이며 A는 B 뒤에 가려져 stop 중인 상태에서 B를 종료
A
onRestart
onStart
onResume
B
onPause
onStop
onDestroy
- A가 다시 실행됨
Activity가 종료되는 경우
- 사용자가 ‘뒤로 가기(Back)’ 버튼을 눌러 Activity를 종료한 경우
- Activity가 백그라운드에 있을 때 시스템 메모리가 부족해진 경우(OS가 강제 종료시킴)
- 언어 설정을 변경할 때
- 화면을 가로/세로 회전할 때
- 폰트 크기나 폰트를 변경했을 때
화면 회전 시 라이프 사이클
화면을 회전할 때 발생하는 이벤트들은 다음과 같습니다. 화면을 회전할 때마다 Activity가 종료되고 새로 만들어지기 때문에 라이프 사이클을 잘 이해하고 대처하는 것이 좋을 것 같습니다.
onPause() → onSaveInstanceState() → onStop() → onDestory() → onCreate() → onStart() → onResume()
Fragment에서의 onSaveInstanceState
Activity에서와 마찬가지로 Fragment에서도 onSaveInstanceState 메소드를 이용해서 기존 데이터를 유지하도록 할 수 있습니다.
Fragment 종료 시 onPause() → onSaveInstanceState() 순서로 호출됩니다.
Fragment 시작 시 라이프 사이클
onAttach() → onCreate() → onCreateView() → onActivityCreated() → onStart() → onResume()
Fragment 전환 시 라이프 사이클
onPause() → onSaveInstanceState() → onStop() → onDestoryView() → onDestory() → onDetach() → onAttach() → onCreate() → onCreateView() → onActivityCreated() → onStart() → onResume()
출처 : https://snowdeer.github.io/android/2017/08/16/android-on-save-instance-state/
onSaveInstanceState 활용하기 (Activity 데이터 유지) · snowdeer's Code Holic
onSaveInstanceState 활용하기 (Activity 데이터 유지) 16 Aug 2017 | Android onSaveInstanceState() 메소드를 이용하면 Activity가 종료될 때 데이터를 저장할 수 있습니다. 일반적으로 사용자가 정상적인 행동으로 Activity를 종료할 때는 해당 이벤트를 미리 감지하고 그에 맞는 대처를 해줄 수가 있지만, 실제로는 다양한 상황에서 Activity가 종료되는 현상이 발생할 수 있습니다. Activi
snowdeer.github.io
액티비티 동적 상태 데이터 저장하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 이전 상태 정보 여부 확인
if (savedInstanceState != null)
textView.text = savedInstanceState.getString("prevText")
else textView.text = "asd"
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
textView.text = "qwe"
}
})
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("prevText", textView.text.toString())
}
}r
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
textView.text = "asd"
button.setOnClickListener(object : View.OnClickListener {
override fun onClick(v: View?) {
textView.text = "qwe"
}
})
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("prevText", textView.text.toString())
}
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
// 이전 상태 정보 여부 확인
textView.text = savedInstanceState.getString("prevText")
}
|
onCreate()가 아닌 onRestoreInstanceState()에서도 저장 가능 (같은 결과 동작)
'안드로이드' 카테고리의 다른 글
RecyclerView 선택을 커스터마이징하기 (0) | 2019.12.31 |
---|---|
Kotlin ListView 구현하기 (0) | 2019.12.28 |
안드로이드 4대 컴포넌트 (0) | 2019.12.27 |
안드로이드 기본 구조 (0) | 2019.12.27 |
View와 ViewGroup (0) | 2019.12.27 |