[ Android ] 액티비티와 태스크
이번 포스팅에서는 액티비티의 개념과 생명주기, 그리고 태스크 및 프로세스에 대해 적어보겠습니다.
---
1. 액티비티(Activity)란?
▶️ 액티비티 개념
안드로이드에서 액티비티(Activity) 는 앱의 화면을 구성하는 기본 단위입니다. 한 개의 액티비티가 하나의 화면을 담당하며, 여러 개의 액티비티를 조합하여 앱을 구성할 수 있습니다.
▶️ 액티비티의 특징
- 앱 간의 경계가 느슨함: 다른 앱의 액티비티도 호출할 수 있음.
- 파일 시스템은 앱 간 격리되지만, 실행 시 경계가 없음.
- 액티비티 호출 시 특정 기능이 아닌 초기 화면으로 실행됨.
- 액티비티는 태스크(Task) 단위로 관리됨.
---
2. 태스크(Task)와 프로세스(Process)
▶️ 태스크(Task)란?
태스크(Task)는 사용자가 하나의 애플리케이션처럼 인식하는 액티비티들의 집합입니다. 여러 개의 앱에서 온 액티비티들이 하나의 태스크에 포함될 수도 있습니다.
▶️ 프로세스(Process)란?
안드로이드에서는 앱 하나가 기본적으로 하나의 프로세스에서 동작합니다. 하지만 특정 설정을 통해 다수의 프로세스를 사용할 수도 있습니다.
---
3. 액티비티 스택(Activity Stack)
안드로이드에서 액티비티는 스택 구조(LIFO: Last In, First Out) 로 관리됩니다.
- 액티비티 A에서 B를 실행하면 A는 백그라운드로 이동하고 B가 실행됨.
- 사용자가 "뒤로 가기"를 누르면 B가 종료되고 A가 다시 활성화됨.
- 앱이 다시 실행될 때 마지막 실행된 액티비티가 아닌 처음 액티비티가 실행될 수도 있음.
- 제일 밑에 있는 액티비티( 최초로 실행된 액티비티 )는 루트 액티비티라고 칭함
---
4. 액티비티 생명주기(Activity Lifecycle)
안드로이드에서는 메모리 및 성능 최적화를 위해 액티비티의 상태를 자동으로 관리합니다. 생명주기 콜백 메소드를 활용하면 액티비티의 상태 변화를 감지할 수 있습니다.
활성 혹은 실행 상태
- 전경 화면에 있을 경우
- 해당 액티비티가 사용자 동작에 대한 초점을 가짐
- 사용자와 상호작용 가능
중지 상태 ( 일시 멈춤 )
- 초점을 보유하지 않았지만, 사용자에게 일부 보임
- 메모리가 극도로 부족할 경우 시스템에 의하여 강제 종료
- 사용자와 상호 작용 불가
정지 상태 ( 멈춤 )
- 사용자에게 전혀 보이지 않지만, 여전히 모든 상태와 멤버 정보는 유지
- 다른 컴포넌트가 메모리를 요청하면 시스템에 의하여 강제 종료
메소드 | 설명 |
onCreate() | 액티비티가 최초 생성될 때 호출됨 ( UI 초기화 ) |
onStart() | 액티비티가 화면에 나타나기 직전에 호출됨 |
onResume() | 액티비티가 화면에 나타나고 사용자 입력을 받을 준비가 됨 ( = 액티비티 스택의 최상위에 위치함 ) |
onPause() | 다른 액티비티가 나타나면 호출됨 ( UI 저장 필요함 )
|
onStop() | 액티비티가 완전히 보이지 않을 때 호출됨 ( = 액티비티 스택의 최상위에 위치하지 않음 ) |
onDestroy() | 액티비티가 종료될 때 호출됨 ( 리소스가 해제됨 ) |
onRestart() | onStop() 후 다시 시작될 때 호출됨 |
▶️ 액티비티 상태 저장 및 복원
- 일반적으로 정지된 액티비티는 사용자가 다시 사용할 것을 대비하여 메모리에 상주. 만약 메모리가 부족하게 되면 강제 종료
- 액티비티를 다시 호출하면,
- 강제 종료된 상태: 다시 액티비티를 생성한 후 액티비티를 실행
- 강제 종료되지 않은 상태: 액티비티를 다시 만들 필요가 없고 액티비티를 다시 시작하여 화면에 표시
- onSaveInstanceState()
- onPause() 혹은 onStop() 이후 메모리가 부족할 경우 프로세스가 메모리에서 제거될 수 있음
- 메모리에서 제거되기 전 액티비티 상태를 저장
- 매개변수로 액티비티의 동적 상태를 기록할 수 있는 번들(Bundle) 오브젝트를 가짐
- onRestoreInstanceState()
- onCreate() 혹은 onStart() 이후 저장된 액티비티 상태를 복원
- onSaveInstanceState()와 onRestoreInstanceState()는 생명주기 메소드가 아니기 때문에 항상 호출되지 않음. 개발자가 해당 코드의 메소드를 재정의하여 구현
- 매개변수로 사용되는 savedInstanceState는 저장된 인스턴스의 상태, 즉 액티비티의 UI 상태를 의미
---
5. 리소스(Resources) 관리
안드로이드에서는 코드와 리소스를 분리하여 유지보수 및 다국어 지원을 쉽게 합니다. 리소스는 `/res` 디렉토리에 저장되며, 종류는 다음과 같습니다.
리소스 | 설명 |
drawable | 이미지 및 아이콘 |
layout | 사용자 인터페이스 레이아웃 XML 파일 |
values | 문자열, 색성, 크기 등 |
aapt(Android Asset Packaging Tool)가 리소스를 모두 파악하여 자원을 접근하기 위한 변수의 정의를 담은 R.java 생성
▶️ 리소스 접근 방법
// 문자열 가져오기
String text = getResources().getString(R.string.app_name);
// 색상 가져오기
int color = getResources().getColor(R.color.primaryColor);
// 이미지 설정
ImageView iv = (ImageView)findViewById(R.id.layoudId);
iv.setImageResource(R.drawable.logo);
// 크기 참조
float size = getResources().getDimension(R.dimen.name)
// 레이아웃 참조
ImageView iv = (ImageView)findViewById(R.id.layoudId);
// 리소스 참조
@string/name
// 시스템 리소스 참조
android.R.*
---
6. 최신 레이아웃 시스템: ConstraintLayout
과거에는 `LinearLayout`이 많이 사용되었지만, 최근에는 `ConstraintLayout`도 자주 쓰입니다. `ConstraintLayout`은 디자인 툴에서 쉽게 조작할 수 있는 장점이 있습니다.
▶️ 주요 속성
속성 | 설명 |
layout_constraintLeft_toLeftOf | 왼쪽을 다른 뷰의 왼쪽에 정렬 |
layout_constraintTop_toTopOf | 상단을 다른 뷰의 상단에 정렬 |
layout_constraintBottom_toBottomOf | 하단을 다른 뷰의 하단에 정렬 |
layout_constraintStart_toEndOf | 시작점을 다른 뷰의 끝점에 정렬 ( RTL 지원 ) |
layout_constraintHorizontal_bias | 가로 정렬 비율 |
layout_constraintVertical_bias | 세로 정렬 비율 |
...~~End(1)_toStart(3)Of = "parent(2)
- 해석하자면, 나의 End(1)는 parent(2)의 Start(3)에 붙어있다.
---
7. 기타
7-1. "@+id/editText01" vs. "@id/editText01"
- : 이 구문은 새로운 리소스 ID를 생성하거나 참조하고자 할 때 사용됩니다. @+id/는 editText01이라는 ID가 존재하지 않으면 새로 생성하라는 지시입니다. 따라서 이 ID가 XML 파일의 이전 부분에서 정의되지 않았다면 새로운 ID가 생성됩니다.
- @id/ 구문은 이미 존재하는 리소스 ID를 참조할 때 사용됩니다. 이는 editText01이라는 ID가 이미 존재해야 함을 의미하며, 해당 ID가 미리 정의되지 않았다면 오류가 발생할 수 있습니다.
🔗 정리
1. 액티비티(Activity) 는 앱의 개별 화면을 담당하며, 태스크(Task) 는 여러 액티비티가 모여 사용자가 하나의 앱처럼 인식하는 단위입니다.
2. 액티비티는 LIFO(후입선출) 방식의 스택 구조로 관리됩니다.
3. 생명주기 콜백 메소드를 활용하여 액티비티의 상태 변화를 처리할 수 있습니다.
4. onSaveInstanceState() / onRestoreInstanceState()를 이용해 데이터 유실을 방지할 수 있습니다.
5. 리소스(Resources) 를 적절히 분리하여 유지보수 및 다국어 지원을 쉽게 합니다.