[Android] Jetpack 컴포넌트 - Lifecycles

sw·2022년 1월 13일
0
post-custom-banner

1. Lifecycle-aware 컴포넌트란?

Activity나 Fragment 같은 다른 컴포넌트의 Lifecycle이 변경될 때 이에 대응하는 라이브러리.
Component(안드로이드 component가 아닌 자신 만의 역할이 있는 코드 component)가 lifecycleOwner의 상태변화를 observe하여 필요한 작업을 스스로 하는 기능

왜 필요할까?
-> 일반적으로는 Activity나 Fragment의 생명 주기 메소드에 데이터를 불러오거나 리소스를 정리한다. 하지만 프로그램 규모가 커지면서 코드가 광범위해지고 잠재적인 에러 유발 요소가 된다.
그래서 생명 주기에 의존적이었던 코드를 걷어 내고 lifecycle-aware 컴포넌트에 이에 대한 처리를 위임함으로써 유지보수성을 높인다.
component가 lifecycle에 따른 작업을 소유할 수 있도록 하며, 이런 component를 Lifecycle aware하다고 한다.

  • androidx.appcomapt:appcompat을 이미 사용하고 있다면 Lifecycle-aware 컴포넌트들이 포함되어 별도의 작업이 필요없다.

  • androidx.lifecycle 패키지는 activity나 fragment의 생명 주기 상태에 따라 자동으로 동작을 조정할 수 있는 클래스와 인터페이스를 제공한다.


2. Lifecycle 클래스

Activity나 Fragment 같은 컴포넌트의 생명 주기 상태에 대한 정보를 가지고 다른 객체가 이를 관찰할 수 있도록 돕는 클래스

Event와 State를 통해 연관된 컴포넌트들의 생명 주기 상태를 추적한다. 생명 주기에 변화가 생기면 등록된 Observer를 실행해주는 역할을 한다.

2-1. Event

  • FrameworkLifecycle클래스로부터 얻는 생명 주기 이벤트를 말한다. 이런 이벤트들은 activity와 fragment의 콜백 이벤트에 매핑된다.
  • ON_ANY,ON_CREATE, ON_DESTROY, ON_PAUSE, ON_RESUME , ON_START, ON_STOP

2-2. State

  • Lifecycle 객체가 추적한 컴포넌트의 현재 상태를 뜻한다.
  • State는 그래프의 노드이고, Event는 두 노드 사이를 이동하는 사건이라고 생각하자!!!!

2-3. 구조

Lifecycle 객체에 Observer를 등록해 놓으면 activity나 fragment의 생명주기 변경 시 Lifecycle 객체가 등록된 Observer를 실행하는 구조.

3. LifecycleOwner

클래스에 Lifecycle이 있음을 나타내는 함수인 getLifecycle()메소드 하나만 가진 인터페이스

public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

반환값이 되는 Lifecycleabstract classLifecycle Observer를 추가하고 제거하며 현재 state를 확인할 수 있는 인터페이스를 제공한다.

public abstract class Lifecycle {

 @MainThread
 public abstract void addObserver(@NonNull LifecycleObserver observer);

 @MainThread
 public abstract void removeObserver(@NonNull LifecycleObserver observer);

 @MainThread
 @NonNull
 public abstract State getCurrentState();

 public enum Event {
     // ...
 }

 public enum State {
     // ...
 }
}
  • 다시 말해 Lifecycle의 소유권을 추상화하는 인터페이스로 Lifecycle을 반환하는 getLifecycle()메소드 하나만을 가진다.

  • AppCompatyActivityFragmentLifecycleOwner가 이미 구현되어 있어 getLifeCycle() 메소드로 쉽게 Lifecycle을 사용할 수 있다. 다른 클래스들은 LifecycleOwner를 구현해야 한다.

  • 사용자 정의 LifecycleOwner를 구현하려면 LifecycleRegistry를 사용하면 된다.

LifecycleRegistry
Lifecycle의 구현체가 바로 LifecycleRegistry인데 등록된 여러 Observer를 handle할 수 있다. override한 주요 메소드는 addObserver, removeObserver 등 Observer 객체를 관리하기 위한 것과 LifecycleState를 지정하거나 변경할 수 있는 메소드들이다.

class MyActivity : Activity(), LifecycleOwner {

    private lateinit var lifecycleRegistry: LifecycleRegistry

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycleRegistry = LifecycleRegistry(this)
        lifecycleRegistry.currentState = Lifecycle.State.CREATED
    }

    public override fun onStart() {
        super.onStart()
    	lifecycleRegistry.currentState = Lifecycle.State.STARTED
    }

    override fun getLifecycle(): Lifecycle {
        return lifecycleRegistry
    }
}



4. Observer

  • LifecycleObserver 인터페이스를 사용하면 되지만 해당 인터페이스를 직접 사용하지 않고 이를 구현하여 작성된 인터페이스인 DefaultLifeCycleObserverLifecycleEventObserver를 사용한다.

4-1. DefaultLifeCycleObserver

  • LifeCycleOwner의 상태 변경을 관찰하는 콜백 인터페이스
    만약 DefaultLifeCycleObserverLifecycleEventObserver를 모두 구현했다면 DefaultLifecycleObserver의 메소드들이 먼저 호출되고 나서 LifecycleObserver.onStateChanged()의 호출이 따라온다.

4-2. LifecycleEventObserver

  • 생명주기의 변화를 수신하여 receiver에게 보낼 수 있는 클래스
    LifecycleEventObserver의 메소드는 1개 존재하고 생명주기가 변할 때 Event가 넘어오게 되고 해당 Event를 분기해서 필요한 코드를 호출하는 구조이다.
class MyLifeCycleObserver : DefaultLifecycleObserver, LifecycleEventObserver {

    override fun onCreate(owner: LifecycleOwner) {
        super.onCreate(owner)
        Log.d(owner.toString(), "onCreate")
    }

    override fun onResume(owner: LifecycleOwner) {
        super.onResume(owner)
        Log.d(owner.toString(), "onResume")
    }

    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_CREATE -> {
                Log.d(source.toString(), "onCreateEvent")

            }
            Lifecycle.Event.ON_START -> {
                Log.d(source.toString(), "onStartEvent")
            }
            else -> {}
        }
    }
}

//MainActivity.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycle.addObserver(MyLifeCycleObserver())
        // Observer를 activity에 연결하면 MainActivity의 생명 주기를 
        // MyLifecycleObserver 클래스에서 받을 수 있다.
        // lifecycle은 개발자가 작성한 클래스가 아니므로 getLifecycle()메소드 이용
    }
}
profile
끄적끄적
post-custom-banner

0개의 댓글