[Architecture] Single Activity Architecture (SAA)

이석규·2023년 7월 4일
0

Single Activity Architecture

기존의 액티비티 기반의 화면 구성이 아닌, 소수의 액티비티와 다수의 프래그먼트를 이용해 화면을 구성하는 구조를 뜻한다.

  • 장점
    • 프레그먼트를 주로 사용하기 때문에 동일한 플로우 기준으로 액티비티보다 가볍다.
    • JetPack Navigation을 함께 쓰면 프레그먼트 플로우를 Navigation & Graph로 관리할 수 있고, 가시적으로 확인할 수 있다.
    • 하나의 액티비티에 존재하기 때문에, 화면(프레그먼트) 간 상호작용이 편리하고 빠르다.
  • 단점
    • 프레그먼트의 많은 라이프사이클로 예상하지 못한 UI 가 진행될 수 있다.
    • 남아 있는 액티비티는 빈 껍데기가 되어 액티비티가 늘어나면 빈 껍데기가 늘어난다.
    • 소수의 액티비티이지만, 극단적으로 단일 액티비티를 사용하는 것이 오히려 안전하다.
    • 복잡한 서비스에서는 수십개의 프레그먼트는 더 이상 가시성이라는 장점을 볼 수 없다.

SAA를 사용함으로써 다음 화면을 두 가지 프레그먼트로 분리하여 구현할 수 있다.


기본적인 모듈 구조

navigation 모듈에는 별 다른 코드 없이 nav_graph.xml 파일 하나만 존재한다. 가장 하단에 navigation 모듈이 있고, 그것을 참조하여 Fragment끼리의 이동을 시켜주는 것이다. Fragment의 이동이 필요한 모듈의 경우 Navigation 모듈을 참조하도록 하면 되는데, 보통 Navigation 모듈이 필요한 경우 Core 모듈도 높은 확률로 참조하고 있기 때문에 Core 모듈로 통합하여 사용해도 무관하다.


Fragment 상태 저장

Fragmnet 상태를 저장하는 방법은 여러가지다.

1. ViewModel을 통해 관리

여러가지 Configuration Change에 대응하기 위해 모든 상태를 ViewModel에 저장하는 것은 점점 Viewmodel을 커지게 한다.

Configuration Change 란?
일부 기기 구성에서 앱이 실행되는 동안 변경 될 수 있는 사항을 뜻한다.

  • 앱 디스플레이 크기
  • 화면 방향
  • 글꼴 크기 및 두께
  • 언어
  • 테마 변경 (어두운 모드와 밝은 모드)
  • 키보드 사용 가능 여부
  • 멀티 윈도우 모드나 자유 형식 창에서 애플리케이션 크기 조절

2. hide & show

Fragment 간 전환이 이루어질 때, replace
가 아닌 hideshow로 잠깐 보이지 않게 하는 방법이다.

하지만 Navigation을 사용하면 기본 방식이 replace기 때문에 사용이 불가능하다. 하지만 Navigation은 Fragment의 상태 저장을 내부적으로 도와준다.

2-1. onSaveInstanceState & onRestoreInstanceState

Android에서 제공되는 모든 뷰에 구현되어 있는 함수다. onDestroyView이전에 뷰의 상태가 저장되고, 복구되는 시점은 onViewCreated 이후인 뷰가 완전히 생성되었을 때이다.


Fragment 숨김 처리

참고한 포스팅에서는 네비게이션 바를 덮는 FragmentContainerView를 염두에 두고 BottomNavigation 처리를 고민하였지만, 이를 포괄적으로 특정 Fragmentf를 안 보이게 하는 방식으로 이해해 보았다.

Activity로 띄우는 거나, 화면 이동 후 직접적으로 이를 숨겨주는 navigate 메서드를 활용하는 방법도 있지만, 가장 효율적인 방법은 Navigation Component의 속성을 활용하는 것이라고 한다.

// AppBar 설정
val appBarConfiguration = AppBarConfiguration(setOf(
    R.id.map_fragment,
    R.id.second_fragment,
    R.id.third_fragment
))

navController.addOnDestinationChangedListener { _, destination, _ ->
    binding.bottomNav.isVisible = appBarConfiguration.topLevelDestinations.contains(destination.id)
}

출처 :
1. https://velog.io/@iamjm29/Single-Activity-Architecture-SAA-%EC%A0%81%EC%9A%A9%EA%B8%B0
2. https://no-dev-nk.tistory.com/99
3. https://developer.android.com/guide/topics/resources/runtime-changes?hl=ko
4. https://heegs.tistory.com/128

profile
안드안드안드

0개의 댓글