关注

Android jetpack Lifecycle(二)原理篇

引言

上一篇我们学习了LifeCycle的简单使用Android jetpack LifeCycle(一)使用篇,那在这一篇主要学习LifeCycle的原理。源码基于androidx.lifecycle:lifecycle-runtime:2.8.3

优势

Lifecycle 是 Android Jetpack 的生命周期感知型组件,通过观察者模式将 Activity/Fragment 的生命周期事件解耦到独立组件中,解决传统开发中手动管理生命周期的痛点:

​解耦性:业务逻辑(如 Presenter、ViewModel)无需直接依赖 Activity/Fragment,通过观察者接收生命周期事件。
​内存安全​:自动解除注册,避免因未及时注销导致的内存泄漏。
​状态一致性​:确保观察者状态与宿主同步,避免无效操作(如在后台更新 UI)。

原理分析前置

原理分析之前,先看下最重要的几个类和状态

三大核心概念

概念接口描述实现类
LifeCycleOwner声明拥有生命周期的组件Activity、Fragment、Service(自定义)
LifeCycle抽象生命周期状态和事件,由 LifecycleRegistry 实现具体管理逻辑LifecycleRegistry
LifecycleObserver观察生命周期事件的组件ViewModel、LiveData、自定义业务类

五大状态

在这里插入图片描述

1、LifecycleOwner
public interface LifecycleOwner {
    /**
     * @return The lifecycle of the provider.
     */
    public val lifecycle: Lifecycle
}

public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
    get() = lifecycle.coroutineScope
}

生命周期持有者,返回一个Lifecycle对象,如果你使用的是 AndroidX(也属于 Jetpack 一部分)在这Activity 、Fragment 两个类中,默认实现了 LifecycleOwner 接口

在这里插入图片描述
在这里插入图片描述
看下 Lifecycle 类是什么

2、Lifecycle

在Lifecycle类中定义了添加观察者和移除观察者方法,并定义了两个枚举类
LifecycleRegistry类是对Lifecycle这个抽象类的具体实现,可以处理多个观察者,如果你自定义 LifecycleOwner可以直接使用它。

public abstract class Lifecycle {
    @MainThread public abstract fun addObserver(observer: LifecycleObserver)
    @MainThread public abstract fun removeObserver(observer: LifecycleObserver)
    @get:MainThread public abstract val currentState: State

	 public enum class Event {
	 //五种状态事件
	 }
	 
    public enum class  State {
       
    }

	public inline fun Lifecycle.addObserver(
    	crossinline action: LifecycleObserver.(source: LifecycleOwner, event: Lifecycle.Event) -> Unit
	): LifecycleObserver {
    	val observer = object : LifecycleEventObserver {
            override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
                action(this, source, event)
            }
        }
    	addObserver(observer)
    	return observer
	}
}
3、LifecycleObserver

啥也没有,一个单纯的接口类。不要直接使用此接口,而应实现 [DefaultLifecycleObserver] 或 [LifecycleEventObserver] 以接收生命周期事件的通知。

public interface LifecycleObserver

前置总结

LifecycleOwner:可获取Lifecycle的接口,可以再 Activity、Fragment生命周期改变时,通过LifecycleRegistry类处理对应的生命周期事件,并通知 LifecycleObserver这个观察者
Lifecycle:是被观察者,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。
LifecycleObserver:观察者,可以通过被LifecycleRegistry类通过 addObserver(LifecycleObserver o)方法注册,被注册后,LifecycleObserver便可以观察到LifecycleOwner对应的生命周期事件
Lifecycle.Event:分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。
Lifecycle.State:Lifecycle组件的当前状态。

了解上面的基本内容,就进行具体的源码分析,通过看源码,就能知道整个流程了。

原理

当你写了一个自定义activity继承自ComponentActivity时,可以使用Lifecycle观察。

ComponentActivity

public class ComponentActivity extends xxx implements LifecycleOwner,xxx {

// 创建了LifecycleRegistry,Lifecycle的实现类
	private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

	@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
		....
		// 将 ComponentActivity 注入到了 ReportFragment 中
        ReportFragment.injectIfNeededIn(this);
        
    }
	// 实现了LifecycleOwner的getLifecycle方法,最终返回的是LifecycleRegistry
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

}

可以看到上述代码**ReportFragment.injectIfNeededIn(this);**
,在onCreate的时候,将这个activity注入到一个隐形的ReportFragment中,由该隐形fragment来感知具体的生命周期变化。

ReportFragment

接下来我们来看看ReportFragment的源码(基于androidx.lifecycle:lifecycle-runtime:2.8.3),他是如何感知生命周期变化的?

public open class ReportFragment() : android.app.Fragment() {
    private var processListener: ActivityInitializationListener? = null
	// 1
    private fun dispatchCreate(listener: ActivityInitializationListener?) {
        listener?.onCreate()
    }

    private fun dispatchStart(listener: ActivityInitializationListener?) {
        listener?.onStart()
    }

    private fun dispatchResume(listener: ActivityInitializationListener?) {
        listener?.onResume()
    }

    override fun onActivityCreated(savedInstanceState: Bundle?) {
        super.onActivityCreated(savedInstanceState)
        dispatchCreate(processListener)
        // 2
        dispatch(Lifecycle.Event.ON_CREATE)
    }

    override fun onStart() {
        super.onStart()
        dispatchStart(processListener)
        dispatch(Lifecycle.Event.ON_START)
    }

    override fun onResume() {
        super.onResume()
        dispatchResume(processListener)
        dispatch(Lifecycle.Event.ON_RESUME)
    }

    override fun onPause() {
        super.onPause()
        dispatch(Lifecycle.Event.ON_PAUSE)
    }

    override fun onStop() {
        super.onStop()
        dispatch(Lifecycle.Event.ON_STOP)
    }

    override fun onDestroy() {
        super.onDestroy()
        dispatch(Lifecycle.Event.ON_DESTROY)
        // just want to be sure that we won't leak reference to an activity
        processListener = null
    }
    private fun dispatch(event: Lifecycle.Event) {
        if (Build.VERSION.SDK_INT < 29) {
            // Only dispatch events from ReportFragment on API levels prior
            // to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks
            // added in ReportFragment.injectIfNeededIn
            dispatch(activity, event)
        }
    }
    // 4
    ...
	@RequiresApi(29)
    internal class LifecycleCallbacks : Application.ActivityLifecycleCallbacks {
        override fun onActivityCreated(
            activity: Activity,
            bundle: Bundle?
        ) {}

        override fun onActivityPostCreated(
            activity: Activity,
            savedInstanceState: Bundle?
        ) {
            dispatch(activity, Lifecycle.Event.ON_CREATE)
        }
		...
        companion object {
            @JvmStatic
            fun registerIn(activity: Activity) {
                activity.registerActivityLifecycleCallbacks(LifecycleCallbacks())
            }
        }
    }

	// 具体实现
	public companion object {
        private const val REPORT_FRAGMENT_TAG =
            "androidx.lifecycle.LifecycleDispatcher.report_fragment_tag"

        @JvmStatic
        public fun injectIfNeededIn(activity: Activity) {
            if (Build.VERSION.SDK_INT >= 29) {
                // On API 29+, we can register for the correct Lifecycle callbacks directly
                LifecycleCallbacks.registerIn(activity)
            }
            // Prior to API 29 and to maintain compatibility with older versions of
            // ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and
            // need to support activities that don't extend from FragmentActivity from support lib),
            // use a framework fragment to get the correct timing of Lifecycle events
            val manager = activity.fragmentManager
            if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
                manager.beginTransaction().add(ReportFragment(), REPORT_FRAGMENT_TAG).commit()
                // Hopefully, we are the first to make a transaction.
                manager.executePendingTransactions()
            }
        }

		// 3
        @JvmStatic
        internal fun dispatch(activity: Activity, event: Lifecycle.Event) {
            if (activity is LifecycleRegistryOwner) {
                activity.lifecycle.handleLifecycleEvent(event)
                return
            }
            if (activity is LifecycleOwner) {
                val lifecycle = (activity as LifecycleOwner).lifecycle
                if (lifecycle is LifecycleRegistry) {
                    lifecycle.handleLifecycleEvent(event)
                }
            }
        }
    }
}    

从以上源码看:

// 2: 在各个生命周期中,都会调用dispatch并传入具体的Event;(以此来感知生命周期!!!)
// 3: dispatch方法主要负责获取Lifecycle,调用handleLifecycleEvent方法来处理生命周期Event事件。
// 4: 在SDK29以上注册了LifecycleCallbacks回调,LifecycleCallbacksApplication.ActivityLifecycleCallbacks的实现类,这是29以上才有的api , 因此在api 29以上,不需要直接感受生命周期,当然在29以下api中,在ReportFragment中主要做的任务也是调用dispatch方法,分发生命周期事件。

看到这里我们就能知道几个问题的答案:
1、Lifecycle是如何感知生命周期的?
api 29以下:在ReportFragment中的各个生命周期都调用了dispatch(Lifecycle.Event event) 方法,传递了不同的Event的值;以此来感知生命周期。
api 29以上:通过注入正确的lifecycleCallback来感知生命周期。

2、Lifecycle是如何处理生命周期的?
api 29以下:通过调用了((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);方法,也就是LifecycleRegistry 类来处理这些生命周期。
api 29以上:一样的,通过调用了((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);方法,也就是LifecycleRegistry 类来处理这些生命周期。

LifecycleRegistry

接下来我们就去看看handleLifecycleEvent是怎么做的。

	public actual open fun handleLifecycleEvent(event: Event) {
    	enforceMainThreadIfNeeded("handleLifecycleEvent")
    	moveToState(event.targetState)
	}
	
     private fun moveToState(next: State) {
        ...
        state = next
        ...
        // 重点!!!!
        sync()   
       ...
    }
    
	public val targetState: State
        get() {
            when (this) {
                ON_CREATE, ON_STOP -> return State.CREATED
                ON_START, ON_PAUSE -> return State.STARTED
                ON_RESUME -> return State.RESUMED
                ON_DESTROY -> return State.DESTROYED
                ON_ANY -> {}
             }
            throw IllegalArgumentException("$this has no target state")
        }

解读一下,其实就是根据传入的Lifecycle.Event的值,也就是 Activity、Fragment 生命周期回调的值,来跳转到下一个 Lifecycle.State 的状态,也就是 Lifecycle 将要到什么状态。
结合我们在五大状态中的图一起看更清楚一点。
在这里插入图片描述

接下来可以直接看sync方法,

	// happens only on the top of stack (never in reentrance),
    // so it doesn't have to take in account parents
    private fun sync() {
        val lifecycleOwner = lifecycleOwner.get()
            ?: throw IllegalStateException(
                "LifecycleOwner of this LifecycleRegistry is already " +
                    "garbage collected. It is too late to change lifecycle state."
            )
        while (!isSynced) {
            newEventOccurred = false
            if (state < observerMap.eldest()!!.value.state) {
                backwardPass(lifecycleOwner)
            }
            val newest = observerMap.newest()
            if (!newEventOccurred && newest != null && state > newest.value.state) {
                forwardPass(lifecycleOwner)
            }
        }
        newEventOccurred = false
        _currentStateFlow.value = currentState
    }

如果没有同步过,会比较state 当前的状态和observerMap中的eldest ,如果小于旧的,则向后,比较state 当前的状态和newest的状态,如果大于最新的,则向前;具体也可以看五大状态的贴图会更清晰。

接下来我们选向前的方向分析流程

	
	private fun forwardPass(lifecycleOwner: LifecycleOwner) {
        @Suppress()
        val ascendingIterator: Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> =
            observerMap.iteratorWithAdditions()
        // 迭代观察者,对每个观察者,当它的状态小于某个 state 且没有新事件发生时,它会向上分发事件    
        while (ascendingIterator.hasNext() && !newEventOccurred) {
            val (key, observer) = ascendingIterator.next()
            while (observer.state < state && !newEventOccurred && observerMap.contains(key)
            ) {
                pushParentState(observer.state)
                // 根据观察者的当前状态获取一个 Event。Event.upFrom(state) 返回
                // 从给定状态向上过渡到下一个状态对应的事件
                //(例如,从 INITIALIZED 到 CREATED 的事件是 ON_CREATE)。
                // 如果不存在向上事件(比如已经是最高状态),会抛出异常。
                val event = Event.upFrom(observer.state)
                    ?: throw IllegalStateException("no event up from ${observer.state}")
                // 重点!!!
                observer.dispatchEvent(lifecycleOwner, event)
                popParentState() 
                // 事件分发完成后,将之前压入的状态从栈中弹出,恢复上下文。
            }
        }
    }

这段代码主要在状态提升时(比如生命周期从CREATED到STARTED)用来将事件分发给观察者,使它们的状态与当前生命周期状态同步。

// local val observer: LifecycleRegistry.ObserverWithState
主要看这段代码:observer.dispatchEvent(lifecycleOwner, event), 调用观察者包装对象的 dispatchEvent 方法,将事件分发给实际的观察者。这最终会调用观察者的回调方法(如 onCreate、onStart 等)。

接下来我们看观察者分发事件的具体方法,

内部类 LifecycleRegistry.ObserverWithState

这个观察者早在我们的owner(Activity或者fragment) addObserver时完成初始化。可以看五大状态下Lifecycle的Lifecycle.addObserver方法

	internal class ObserverWithState(observer: LifecycleObserver?, initialState: State) {
        var state: State
        // 传入的原始观察者,可以是任何实现了 LifecycleObserver 接口或其子接口
        //(如 DefaultLifecycleObserver、LifecycleEventObserver)的对象。
        var lifecycleObserver: LifecycleEventObserver

        init {
        	// 此处会具体转为对应类
            lifecycleObserver = Lifecycling.lifecycleEventObserver(observer!!)
            state = initialState
        }

        fun dispatchEvent(owner: LifecycleOwner?, event: Event) {
            val newState = event.targetState // 传入事件的目标状态
            // 处理向后状态兼容 1
            state = min(state, newState)
            lifecycleObserver.onStateChanged(owner!!, event)
            state = newState
        }
    }

解释:
//1: 这行代码先将当前状态更新为当前状态和新状态中较小的那个(即较低的生命周期阶段)。这里的“较小”是按照生命周期状态的枚举顺序定义的,通常 INITIALIZED 最小,DESTROYED 最大(但实际顺序需参考源码:一般是 INITIALIZED < CREATED < STARTED < RESUMEDDESTROYED 通常视为比 INITIALIZED 还小?)。这里的关键在于 min(state, newState) 会选择较低的状态。

为什么需要先降低状态再回调?

当事件是向上提升时(例如从 CREATED 提升到 STARTED),newState 高于 state,此时 min(state, newState) = state,所以第一次赋值实际上没有改变状态。

但是,当事件是向下降低时(例如从 STARTED 降到 CREATED),newState 低于 state,此时 min(state, newState) = newState,状态会先被降为最终的目标状态,然后再回调。

这背后的设计考量是
在回调观察者之前,将观察者的状态“预置”为目标状态(向下时)或保持原样(向上时),目的是为了在回调过程中,如果观察者内部查询当前状态(比如通过 lifecycle.currentState,能够获得一个在事件分发期间语义上正确的中间状态。这种设计保证了状态变化的原子性.

最后我们来看看最关键的代码onStateChanged

DefaultLifecycleObserverAdapter

internal class DefaultLifecycleObserverAdapter(
    private val defaultLifecycleObserver: DefaultLifecycleObserver,
    private val lifecycleEventObserver: LifecycleEventObserver?
) : LifecycleEventObserver {
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_CREATE -> defaultLifecycleObserver.onCreate(source)
            Lifecycle.Event.ON_START -> defaultLifecycleObserver.onStart(source)
            Lifecycle.Event.ON_RESUME -> defaultLifecycleObserver.onResume(source)
            Lifecycle.Event.ON_PAUSE -> defaultLifecycleObserver.onPause(source)
            Lifecycle.Event.ON_STOP -> defaultLifecycleObserver.onStop(source)
            Lifecycle.Event.ON_DESTROY -> defaultLifecycleObserver.onDestroy(source)
            Lifecycle.Event.ON_ANY ->
                throw IllegalArgumentException("ON_ANY must not been send by anybody")
        }
        lifecycleEventObserver?.onStateChanged(source, event)
    }
}

为啥我会贴出DefaultLifecycleObserverAdapter这个类的重写方法,原因请看下面:

在上面的LifecycleRegistry.ObserverWithState中,初始化时会通过 Lifecycling.lifecycleEventObserver(observer!!) 转换为对应的observer类。这里我们能看到是通过DefaultLifecycleObserverAdapter适配器统一配置的。

@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public actual object Lifecycling {
    @JvmStatic
    @Suppress("DEPRECATION")
    public actual fun lifecycleEventObserver(`object`: Any): LifecycleEventObserver {
        val isLifecycleEventObserver = `object` is LifecycleEventObserver
        val isDefaultLifecycleObserver = `object` is DefaultLifecycleObserver
        if (isLifecycleEventObserver && isDefaultLifecycleObserver) {
            return DefaultLifecycleObserverAdapter(
                `object` as DefaultLifecycleObserver,
                `object` as LifecycleEventObserver
            )
        }
        if (isDefaultLifecycleObserver) {
            return DefaultLifecycleObserverAdapter(`object` as DefaultLifecycleObserver, null)
        }
        if (isLifecycleEventObserver) {
            return `object` as LifecycleEventObserver
        }
        val klass: Class<*> = `object`.javaClass
        val type = getObserverConstructorType(klass)
        if (type == GENERATED_CALLBACK) {
            val constructors = classToAdapters[klass]!!
            if (constructors.size == 1) {
                val generatedAdapter = createGeneratedAdapter(
                    constructors[0], `object`
                )
                return SingleGeneratedAdapterObserver(generatedAdapter)
            }
            val adapters: Array<GeneratedAdapter> = Array(constructors.size) { i ->
                createGeneratedAdapter(constructors[i], `object`)
            }
            return CompositeGeneratedAdaptersObserver(adapters)
        }
        return ReflectiveGenericLifecycleObserver(`object`)
    }
}

统一分发接口:LifecycleRegistry 内部维护的所有观察者都被要求是 LifecycleEventObserver 类型(通过 Lifecycling.lifecycleEventObserver 工厂方法转换)。这样,在遍历观察者时只需调用统一的 onStateChanged 方法,而无需关心观察者原本是哪种类型。

总结

好了,这样就串起来了!最后总结一下。

1、我们的activity或者fragment作为LifecycleOwner,调用addObserver添加了观察者对象;
2、在activity 的oncreate中会通过一个隐形的reportFragment注入。将生命周期转到这个隐形的fragment中感知。
3、在隐形fragment中会分发各个生命周期的事件,在Lifecycle的实现类LifecycleRegsitry中对这个事件进行处理。主要是观察具体状态变更。
4、最终会通过LifecycleObserver的统一适配器处理状态的变更。
5、此时我们的activity或者fragment生命周期就被感知到了。

参考文献:
Android官方架构组件Lifecycle:生命周期组件详解&原理分析

转载自CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_43532972/article/details/158609449

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--