안드로이드

액티비티 (Activity) - 4대 컴포넌트

start1a 2019. 12. 27. 19:06

액티비티

  • 하나의 UI
  • 화면에 UI 표시하는
  • View 또는 ViewGroup 다양한 조합을 화면에 배치하여 UI 표시
  • 앱은 하나 이상의 액티비티가 느슨한 결합 형태

액티비티 백스택

  • 액티비티 생성
  • 이전 액티비티 스택에 push
  • 액티비티 종료로 인해 pop
  • 이전 액티비티 다시 표시

특징

  • 안드로이드 시스템이 직접 관리
  • 안드로이드 시스템에 의해 생성되어 로드되거나 'StartActivity' 함수에 의해 '간접적'으로 띄울 있음

 

액티비티 생명주기

 

출처 : https://kairo96.gitbooks.io/android/content/ch2.4.1.html

 

onStart(), onResume()

  • 처음 시작 실행
  • Activity 가려졌다 돌아올 때도 실행
    • 화면의 일부가 가려짐 (ex. 다이얼로그)
      • onPause() : 일시정지
    • 다른 액티비티로 완전히 전환됨
      • onPause() + onStop() : 정지
  • 시스템이 메모리나 배터리 사용량을 줄이기 위해 액티비티를 메모리에서 완전히 제거하기도
    • 액티비티로 돌아오더라도 다시 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. 왼쪽 회전 후 값이 유지됨

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