[Android] Activity & Fragment

kldaji·2021년 9월 5일
0

서론

이번 포스팅에서는 UI/UX 의 주요 Component 인 ActivityFragment 에 대해 작성하고자 한다. (여기서 UI 는 사용자가 상호작용할 수 있는 화면 그 자체(시각적 디자인)를 의미하며, UX 는 화면과 상호작용하는 사용자 입장에서 더 만족스러운 (편리한, 원활한) 상호작용을 제공해주는 것을 의미한다.)

본론

Fragment 가 출시된 이유

Fragment 가 출시된 정확한 날짜는 잘 모르겠지만, Android 의 UI/UX 를 구현하기 위해 기본적으로 사용된 Component 는 Activity 이다. ActivityAndroid 의 4가지 주요 Component 중 하나인 만큼 UI/UX 측면에서 매우 큰 역할을 차지하고 있다. 하지만 Activity 만으로 UI/UX 를 구현하기에는 몇 가지 한계점이 존재한다.
첫 번째로 ActivityView 의 종속성이다. Fragment 없이 UI/UX 를 구현하게 되면 하나의 Activity 는 여러 View 들을 소유하게 되고, 이 View 들은 해당 Activity 에 의존하게 되기 때문에 동일한 재사용이 불가능하다.
두 번째로 Activity 간의 데이터 공유이다. Application 을 실행하면 화면과 화면 사이의 데이터를 공유하게 되는 경우는 불가피하다. 그렇기 때문에 ActivityActivity 사이의 데이터 공유가 이루어져야 하는데, Activity 는 각각 자신의 메모리 영역을 가지고 있고 서로 공유를 하지 않기 때문에 같은 메모리 안에서 데이터를 공유하는 것보다 좋지 않은 성능을 제공한다. (이는 화면 전환에서도 마찬가지로 각 Activity 는 자신의 메모리 영역을 차지하고 있어 화면 전환 시 일명 Context Switching 과 같은 overhead 가 발생한다.)
이처럼 Activity 만을 사용해 UI/UX 를 구현하기에는 한계가 있어 Fragment 의 개념이 출시되었다. 그렇다면 Fragment 란 무엇일까?
Fragment 는 화면 일부의 UI 를 정의할 수 있는 Component 로 독립적으로 존재할 수 없고 반드시 host (Activity) 를 필요로 한다. 그렇기 때문에 하나의 Activity (host) 는 여러 개의 Fragment 를 가질 수 있으며, 우리는 Fragment 를 통해 ActivityView 의 종속성을 분리할 수 있다. 즉, 비슷한 기능(카테고리) 을 하는 View 들을 하나의 Fragment 로 관리하여 하나의 Component 로 구성할 수 있기 때문에 재사용은 물론이고 관심사 분리를 통해 효율적으로 UI/UX 구현을 할 수 있다. (Tablet 과 같은 큰 화면의 UI/UX 를 효율적으로 (관심사 분리를 통해) 구현하기 위해 Fragment 개념이 생겨났다고 한다.)
사실 필자는 Fragment 를 재사용 할 정도로 큰 project 를 진행해보진 않았지만, 관심사를 분리해 하나의 Activty 를 구성하는 것보다 더 체계적으로 UI/UX 를 구현할 수 있다는 점에 큰 merit 가 있다고 생각했다.
의존성을 분리할 수 있다는 장점 외에도 하나의 host 안에 여러 Fragment 가 존재한다는 것은 Fragment 들은 host 메모리를 공유한다는 뜻이기 때문에 Fragment 간 데이터를 공유할 때에도 좋은 성능을 보이게 된다. (앞서 말했듯이 화면 전환 측면에서도 같은 메모리 내에 전환이 이루어지기 때문에 overhead 가 발생하지 않는다.)
Fragment 도 물론 단점이 존재한다. (해당 내용은 필자가 아직 경험한 바가 없어 확 와닿은 내용은 아니지만, "이런 단점도 있구나~" 라는 정도로만 이해하고 작성한 내용이다.)
host 내에 여러 Fragment 를 관리하기 위해서는 FragmentManager 라는 것이 Transaction 을 통해 관리를 하는데, 이는 비동기로 실행되어 예기치 않은 동작이 발생할 수 있다. 또한 FragmentActivity 처럼 LifeCycle 이 존재하는데, FragmentLifeCycle 까지 고려하게 된다면 Activity 만을 사용했을 때 보다 당연히 더 고민해야할 부분이 많아지게 된다.


Activity Back Stack

지금까지 Fragment 가 출시된 이유를 살펴보면서 Activity 의 역할과 Fragment 의 장/단점에 대해 알아보았고, ActivityFragmentLifeCycle 에 대해 알아보기 앞서 ActivityBack Stack 에 대해 먼저 알아보자.
Android 는 단일 Activity 로도 존재할 수 있지만, 복잡한 project 의 경우, 여러 개의 Activity 로 구성되고 이는 Back Stack 을 통해 관리되어 진다.
개발자라면 다 알고 있는 Stack 의 개념과 매우 동일하지만 몇 가지 option 에 따라 조금 다르게 동작하기 때문에 해당 option 에 대해 중점적으로 다룰 것이다.
우선 optionAndroidManifestLaunchMode 로 관리할 수 있고, Intent Flag 로도 관리할 수 있다.

1. LaunchMode

  • standard
    항상 ActivityStack 에 쌓는다.

  • singleTop
    Activity 실행 시, Stack 최상단의 Activity 가 해당 Activity 와 동일하다면 재사용한다.

  • singleTask
    Activity 가 재사용된다는 점에서 singleTop 과 유사하지만, 최상단 Activity 를 비교하는 것이 아닌 재사용되는 Activity 위에 존재하는 Activitiy 들을 전부 destory 시킨다. (단, taskAffinity 가 다른 경우 새로운 StackActivitypush 한다.)

  • singleInstance
    taskAffinity 와 상관없이 항상 새로운 StackActivitypush 한다.

2. Intent Flag


FragmentManager

결론

Reference

UI, UX

Activity vs Fragment

Activity BackStack

singleTask

singleInstance

profile
다양한 관점에서 다양한 방법으로 문제 해결을 지향하는 안드로이드 개발자 입니다.

0개의 댓글