Android

[ Android ] 액티비티와 태스크

YBin's 2025. 2. 27. 13:22

이번 포스팅에서는 액티비티의 개념과 생명주기, 그리고 태스크 및 프로세스에 대해 적어보겠습니다.

---

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) 를 적절히 분리하여 유지보수 및 다국어 지원을 쉽게 합니다.