앞선 글에서 액티비티는 사용자와 안드로이드 어플리케이션 간에 인터페이스 역할을 한다고 했었다.
액티비티는 사용자가 보기에는 하나의 화면이지만, 내부적으로는 뷰, 뷰그룹으로 이루어져있다.
여기서 뷰란 실제로 사용자에게 보여주는 부분이고, 뷰 그룹은 여러개의 뷰를 묶어 노흔 형태로 보면 된다.
뷰에는 기본적으로 AppcompatImageView, AppcompatTextView, AppcompatEditText 등의 기본적인 화면 구성요소들이 뷰에 포함된다. 또한한 다음 맵, 비디오, 웹 등을 표시하는 고급 구성요소들도 모두 뷰에 포함 된다,
뷰 그룹은 직접적으로 보이지는 않지만 다른 뷰를 담은 컨테이너 역할과 뷰들의 위치를 관리해준다. CoordinatorLayout, ConstrainLayout, RelativeLayout, LinearLayout 등이 포함된다.
가령 AppcompatActivity에 대해서 이야기해보자.
개발을 하면서 수많은 안드로이드 개발자를 만나 봤지만 내가 경이롭다 라고 생각이 드는 개발자들은 저런 계층구조나 안드로이드를 구성하는 컴포넌트 등에 아주 심도 깊은 이해를 하고 있었다.
AppCompatActivity는 Object 클래스에서 시작하여 Context, ContextWrapper, ContextThemeWrapper, Activity, FragmentActivity 순으로 상속된 것을 볼 수있다. 왜 이런 것들을 상속해서 사용하는지 각 클래스를 상속받으면서 생기는 차이점을 공부해본다면, 매우매우 멋진 안드로이드 개발자가 될 수 있을 것이다.
물론 난 매우매우 멋진 안드로이드 개발자가 아니기 때문에 AppCompatActivity와 Acitivty의 차이점에 대해서만 간단하게 알아보고 넘어 갈까 한다.
가장 큰 차이점은 AppCompatActivity는 기본적으로 ActionBar라는 것을 제공해준다. 특별히 코드를 추가 하지 않아도 상단에 타이틀 바에 타이틀을 보여주고, 반면에 Acitivity 클래스를 상속받은 경우에는 타이틀 바와 타이틀을 보여주지 않는다.
또한 내가 가장 중요하게 생각하는 것은 액티비티 생명주기이다.
액티비티 위에서 할일이 많아지면 생명주기가 꽤나 복잡해진다. 물론 모든 것은 RootActivity(액티비티 스택의 가장 위에 올라와 있는 액티비티)의 생명 주기에 의존하기 때문에 단순하게 생각해 볼 수도 있지만, 왼쪽에는 DrawerFragment가 달려있고 액티비티위에 프레그먼트, 그 위에 다이얼로그 등등가 존재하면 분명 헷갈릴 수 있고, 헷갈려 하는 경우도 많이 봤다. 물론 나도 헷갈리기 때문에 액티비티 스택등을 관리해주는 DepthActivity를 따로 만들어서 사용한다.
가령 a Activity에서 b Activity로 넘어 갈 때, a Activity가 destory 이 되고, 그 후에 b Activity가 onCreate 될까 ? 이 문제에 대해선 후에 이야기하기로 하고 기본적인 액티비티의 생명주기에 대해 먼저 말해보자.
액티비티가 실행되면 액티비티의 상태는 onCreate -> onStart -> onResumed 순으로 상태가 변화하고
액티비티가 종료 되면 onPause -> onStop -> onDestroy 순으로 상태가 변화한다.
onCreate : (not yet visible)
액티비티가 최초 생성 시에 호출되고, 초기화 설정 및 리소스에 해당하는 레이아웃을 가져와 화면에 보여주기 위한 준비를 하는 단계.
뷰를 구성할때 초기화 해주는 코드를 작성해준다면 좋겠다!
AppcompatActivity를 상속받아 onCreate 메소드를 override해서 사용하면, 파라미터로 Bundle 객체를 가진다.
(메모리 부족의 이유등의 이유로)액티비티가 강제 종료 되었을때, 액티비티가 가지고 있는 정보들이 모두 사라지고 처음부터 실행되는 상황이 발생할 것이다. 그러나 안드로이드에서는 이런 것을 방지 하기 위해 강제 종료 되기 전의 정보를 Bundle이라는 객체에 가지고 있다가 강제 종료 후 다시 실행 될 때, 기존 정보를 사용할수 있도록 하고 있습니다.
onStart : (visibile)
onStart 함수가 호출되는 경우는 onCreate와 onRestart 이후에 호출 될 수 있습니다. onCreate 함수는 액티비티가 실행할 때 호출되는 것이고, onRestart 는 액티비티가 백그라운드(onStop 상태)에서 포그라운드(onResume 상태) 상태로 변경 되는 시점에 호출됩니다.
onRestart :
보통 액티비티가 백그라운드 상태에서 포그라운드 상태로 변경 될 때, 호출되는 함수입니다.
onResume : (visible)
액티비티가 화면에 표시되며, 버튼 클릭, 텍스트 입력, 영상 시청등과 같은 일들을 할 수 있다. onStart, onPaused 함수 이후에 호출 될 수 있다. onResume은 보통 화면을 업데이트 시키는 코드를 많이 작성하게 되며, 빈번하게 호출되기 때문에 오버헤드가 큰 작업들을 넣는 것은 권장하지 않고 있다.
onPaused : (partially visible ex) 액티비티위에 다이얼로그가 떠있어서 뒤 하면이 어둡게 보이는 상황)
액티비티가 focus를 잃어 버린 상태를 의미하며, 액티비티를 볼수는 있으나, 버튼의 클릭이나 텍스트의 입력과 같은 작업은 할 수 없는 상태이다. onPaused 는 onResume에서 했던 작업들을 정리하는 일을 담당하며, 이후 언제든 onStopped, onDestroyed를 만나 종료될 수 있는 상황이다.
onStop : (hidden)
onPaused 에서 어둡게나마, 부분적으로 나마 볼 수 있었던 화면조차 보이지 않는 상태를 의미한다. 사용자가 앱을 사용하다가 home key를 눌러 앱이 백그라운드 상태가 되었을때, onStop이 호출된다. 이 상태에서는 onDestroyed를 만나 앱이 종료 될 수도 있으며, onRestart를 만나 다시 포그라운드 상태가 되어 화면에 보여질 수도 있다.
onDestroyed : (hidden)
onCreate, onStart, onResume, onPause, onStop, onRestart에서 사용하던 작업들을 종료하도록 처리하는 곳. 액티비티가 종료 될 때 할 수 있는 일들을 처리하는 함수이다. 유저의 마지막 상태를 저장 할 수 있는 마지막 단계라고 할 수 있겠다.
'Android > Development Tips' 카테고리의 다른 글
[펌] Activity 스택 intent flag (0) | 2018.07.12 |
---|---|
Android NDK (0) | 2018.04.12 |
Measuring of String in android (0) | 2018.02.12 |
안드로이드 프로세스와 스레드 (0) | 2017.12.03 |
안드로이드 컴포넌트 (0) | 2017.12.03 |