코딩 일기장/Android(Kotlin)

[Android] Android Architecture Components(AAC)/안드로이드 아키텍처 컴포넌트 - 1. Lifecycles

minWachya 2022. 5. 28. 20:14
반응형
  1. Lifecycle (Easy handling lifecycles)
  2. LiveData (Lifecycle aware observable)
  3. ViewModel (Managing data in a lifecycle)
  4. Room (Object Mapping for SQLite)
  5. Paging (Gradually loading information)

1. Lifecycle

 

공식문서

 

수명 주기 인식 구성요소로 수명 주기 처리  |  Android 개발자  |  Android Developers

새 Lifecycle 클래스를 사용하여 활동 및 프래그먼트 수명 주기를 관리합니다.

developer.android.com

 

LifeCycle이란 무엇인가?

LifeCycle은 안드로이드 생명 주기를 말하기도 하지만,

여기서 소개할 것은 라이브러리인 LifeCycle이다.

이름처럼 안드로이드 생명 주기를 관리해준다.

 

공식 문서의 설명을 가져오면 아래와 같다.

LifeCycle은 Activity나 Fragment와 같은 구성요소의 수명 주기 상태 관련 정보를 포함하며 다른 객체가 이 상태를 관찰할 수 있게 하는 클래스입니다.

 

LifeCycle은 왜 쓰는가?

아래의 코드를 보자.

// 리스너
internal class MyLocationListener(
        private val context: Context,
        private val callback: (Location) -> Unit
) {
    fun start() { ~ }
    fun stop() { ~ }
}

// ---------

class MyActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener

    override fun onCreate(...) {
        myLocationListener = MyLocationListener(this) { location ->
            // update UI
        }
    }
    
    // !!!주목!!! (액티비티 활동 주기에 맞게 리스너의 활동도 조절해주고 있음)
    public override fun onStart() {
        super.onStart()
        myLocationListener.start()
    }
    public override fun onStop() {
        super.onStop()
        myLocationListener.stop()
    }
}

!!!주목!!! 부분을 보면 MyLocationListener의 활동을 MyActivity 안에서 조절하고 있는 것을 볼 수 있다.

이때 MyLocationListener을 조절해야하는 Activity가 많이 늘어나면 그 Activity마다 

public override fun onStart() {
        super.onStart()
        myLocationListener.start()
    }
public override fun onStop() {
        super.onStop()
        myLocationListener.stop()
    }

이 코드를 계속 써주어야 한다.

 

문제 1) 이런 식으로 MyLocationListener의 활동을 관리해주는 것은 매우 비효율적이다.

문제 2)  Actuvuty나 Fragment가 중지되기 전에 구성요소가 시작된다는 보장도 없다.

이러한 문제들을 해결하기 위해 LifeCycle이라는 것이 나오게 되었다.

 

LifeCycle은 어떻게 사용하는가?

설명 주석 참고

// 1. 클래스는 DefaultLifecycleObserver를 구현하고
class MyObserver : DefaultLifecycleObserver {
	// 2. onCreate, onStart 등의 메서드를 override하여 구성요소의 수명 주기 상태를 모니터링할 수 있음
    override fun onResume(owner: LifecycleOwner) {
        connect()
    }

    override fun onPause(owner: LifecycleOwner) {
        disconnect()
    }
}

// ------

// 3. Lifecycle 클래스의 addObserver() 메서드를 호출하고
// (Observer의 인스턴스를 전달하여) Observer를 추가할 수 있음
myLifecycleOwner.getLifecycle().addObserver(MyObserver())

+) LifeCycleOwner??

위 주석의 3번에서 myLifeCycleOwner를 볼 수 있는데, 이는 LifecycleOwner 인터페이스를 구현한 것이다.

LifecycleOwner는 클래스에 Lifecycle이 있음을 나타내는 단일 메서드 인터페이스로 getLifecycle()를 통해 Lifecycle을 가져올 수 있다.

 

LifeCycleOwner 어케 쓰는지는 주석에!

// 1. MyLocationListener 클래스에서 DefaultLifecycleObserver를 구현하도록 한 후
// 리스너
internal class MyLocationListener(
        private val context: Context,
        private val lifecycle: Lifecycle,
        private val callback: (Location) -> Unit
): DefaultLifecycleObserver {
    private var enabled = false
    override fun onStart(owner: LifecycleOwner) {
        if (enabled) { /* connect */ }
    }
    
    fun enable() {
        enabled = true
        if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) { 
        	/* connect if not connected */ 
        }
    }
    
    override fun onStop(owner: LifecycleOwner) { /* disconnect if connected */ }
}

// ------

class MyActivity : AppCompatActivity() {
    private lateinit var myLocationListener: MyLocationListener

	// 2. onCreate() 메서드에서 Activity의 Lifecycle로 클래스를 초기화할 수 있음
	// (이렇게 하면 MyLocationListener 클래스가 자립할 수 있음)
    // (즉, 수명 주기 상태의 변경에 반응하는 로직이 Activity 대신 MyLocationListener에서 선언됨)
    override fun onCreate(...) {
        myLocationListener = MyLocationListener(this, lifecycle) { location ->
            // update UI
        }
        Util.checkUserStatus { result ->
            if (result) {
                myLocationListener.enable()
            }
        }
    }
}

 

MyLocationListener의 lifecycle 파라미터로 현재 상태를 확인하여 로직을 짤 수 있게 된다!

 

LifeCycle은 언제 쓰는가?

  • 대략적인 위치/세분화된 위치 업데이트 간 전환.
    • 수명 주기 인식 구성요소를 사용하면 위치 앱이 공개 상태이면 세분화된 위치 업데이트를 사용하고, 앱이 백그라운드에 있으면 대략적인 위치 업데이트로 전환할 수 있습니다. 수명 주기 인식 구성요소인 LiveData를 사용하면 사용자가 위치를 변경할 때 앱에서 자동으로 UI를 업데이트할 수 있습니다.
  • 동영상 버퍼링 중지와 시작.
    • 수명 주기 인식 구성요소를 사용하면 동영상 버퍼링을 최대한 빨리 시작하지만, 앱이 완전히 시작될 때까지 재생을 연기합니다. 또한 수명 주기 인식 구성요소를 사용하여 앱이 제거될 때 버퍼링을 종료할 수 있습니다.
  • 네트워크 연결 시작과 중지.
    • 수명 주기 인식 구성요소를 사용하면 앱이 포그라운드에 있는 동안 네트워크 데이터를 실시간으로 업데이트(스트리밍)할 수 있으며, 앱이 백그라운드로 이동하면 실시간 업데이트를 자동으로 일시중지할 수도 있습니다.
  • 애니메이션 드로어블 일시중지와 재개.
    • 수명 주기 인식 구성요소를 사용하면 앱이 백그라운드에 있는 동안 애니메이션 드로어블 일시중지를 처리하고, 앱이 포그라운드로 이동한 후 드로어블을 재개할 수 있습니다.

 


갑자기 공부 시작

내가 모르는 게 넘 많은듯

 

백그라운드에 있을 때랑 포그라운드에 있을 때 동작이 달라지는 게

지금 내가 하고 있는 플젝에 있든가...??? 계속 생각하고 있어야겠다.


참고

https://hyuncb.tistory.com/2

 

안드로이드 아키텍쳐 컴포넌트(Android Architecture Components) - 1부

Google IO 2017에서 가장 흥미로웠던 주제는 "안드로이드 아키텍쳐 컴포넌트" 였다. 개발자들은 MVC, MVP, MVVM등 여러가지 패턴을 사용했었었는데, 이제는 구글의 아키텍쳐 컴포넌트 권고사항을 많이

hyuncb.tistory.com

 

https://medium.com/@maryangmin/android-architecture-components-%EC%86%8C%EA%B0%9C-1-8e04491be1f6

 

Android Architecture Components 소개 (1)

Google I/O 2017에서 새로운 라이브러리들을 Android Architecture Components(AAC)로 묶어서 발표하였습니다. Google은 AAC를 안드로이드 앱을 개발하면서 자주 만날 수 있는 문제들을 쉽게 해결할 수 있는…

medium.com

 

반응형