Android Jetpack之Lifecycle的源码分析

本文详细分析了Android Jetpack的Lifecycle组件,包括LifecycleOwner(如Fragment和AppCompatActivity)如何处理生命周期,LifecycleRegistry的实现,以及LifecycleObserver的多种实现方式。LifecycleOwner通过LifecycleRegistry监听和处理生命周期变化,LifecycleObserver则提供了接口和注解方式来响应生命周期事件。文章还探讨了事件处理的逻辑和状态转换,展示了LifecycleObserver如何适配不同的生命周期回调。
摘要由CSDN通过智能技术生成


Lifecycler结构图

Lifecycle组件中的类结构,LifecycleOwner表示拥有生命周期功能。

Lifecycle定义了Android中的生命周期的接口。而LifecycleObserver是生命周期的监听的接口。Lifecycle可以注册和反注册LifecycleObserver,二者为观察者模式。

LifecycleOwner

public interface LifecycleOwner {
    
    @NonNull
    Lifecycle getLifecycle();
}

LifecycleOwner只有一个简单的接口,获取Lifecycle。而support现在的库中的FragmentAppCompatActivity均实现了此接口。

Fragment

在这里插入图片描述

现在的support库中的Fragment实现了LifecycleOwner,我们来观摩一下。

@Override
public Lifecycle getLifecycle() {
    
    return mLifecycleRegistry;
}

Fragment直接返回变量mLifecycleRegistry,

LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

变量是LifecycleRegistry的对象。

Fragment实现了LifecycleOwner,并返回了LifecycleRegistry类的对象。

mLifecycleRegistry怎么知道生命周期变化的呢?

performCreate方法中,调用支持onCreate方法并使用mLifecycleRegistry来处理Lifecycle.Event.ON_CREATE

void performCreate(Bundle savedInstanceState) {
    
    ······
    onCreate(savedInstanceState);
    ······
    mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}

同样的:

  • performStart调用onStart方法并使用mLifecycleRegistry处理Lifecycle.Event.ON_START
  • performResume调用onResume方法并使用mLifecycleRegistry处理Lifecycle.Event.ON_RESUME
  • performStop调用onStop方法并使用mLifecycleRegistry处理Lifecycle.Event.ON_STOP
  • performDestroy调用onDestroy并使用mLifecycleRegistry处理Lifecycle.Event.ON_DESTROY

调用生命周期的相关的方法的同时,也使用mLifecycleRegistry处理Lifecycle.Event中的相应事件。

mLifecycleRegistry通过此种方式来监听生命周期的变更的。(至于什么时候执行performXX方法可以自行分析)。

AppCompatActivity

AppCompatActivity继承关系比较深,最终基础类为SupportActivity

	private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    @Override
    public Lifecycle getLifecycle() {
    
        return mLifecycleRegistry;
    }

SupportActivity也是返回LifecycleRegistry返回。但是使用的Fragment来监听的生命周期。

protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    super.onCreate(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
}

其实委托给ReportFragment处理生命周期。

在这里插入图片描述

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    
    super.onActivityCreated(savedInstanceState);
    dispatchCreate(mProcessListener);
    dispatch(Lifecycle.Event.ON_CREATE);
}

onActivityCreated方法中调用dispatch方法分发Lifecycle.Event.ON_CREATE事件。

private void dispatch(Lifecycle.Event event) {
    Activity activity = getActivity();
    if (activity instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
        return;
    }
	//SupportActivity实现了LifecycleOwner,会调用此代码
    if (activity instanceof LifecycleOwner) {
        Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
        if (lifecycle instanceof LifecycleRegistry) {
            ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
        }
    }
}

SupportActivity实现了LifecycleOwner方法,最终会调用到SupportActivitymLifecycleRegistry处理事件。

类似:

  • onStart方法中发送Lifecycle.Event.ON_CREATE事件。
  • onResume方法中发送Lifecycle.Event.ON_RESUME事件。
  • onPause方法中发送Lifecycle.Event.ON_PAUSE事件。
  • onStop方法中发送Lifecycle.Event.ON_STOP事件。
  • onDestroy方法中发送Lifecycle.Event.ON_DESTROY事件。

SupportActivity通过ReportFragment间接处理生命周期的监听。

但还有个问题

protected void onSaveInstanceState(Bundle outState) {
    
    mLifecycleRegistry.markState(Lifecycle.State.CREATED);
    super.onSaveInstanceState(outState);
}

通过onSaveInstanceState()保存AppCompatActivity的状态时,在调用ON_START事件之前,UI认为是不可变的。在onSaveInstanceState()之后才会调用AppCompatActivityonStop()方法,在不允许UI状态更改,但是Lifecycle尚未移到CREATED状态(AppCompatActivityonStop()方法尚未调用)的存在间隙。

为了防止UI变更,因此这里标记了状态为Lifecycle.State.CREATED

Lifecycle

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

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

    @MainThread
    public abstract State getCurrentState();
}

Lifecycle定义了生命周期类。用于派发生命周期。包含三个方法addObserver添加观察者,removeObserver移除观察者,getCurrentState获取当前的状态。

LifecycleRegistry实现了此接口。可以直接使用它来定义自己的LifecycleOwner

LifecycleRegistry

在这里插入图片描述

我们先跟踪事件处理的逻辑。

分析LifecycleRegistry的实现

假设我们继承Frgment并添加LifecycleObserver

class LifeycycleFragment : Fragment() {
    

    private val mLifecycleObserver: LifecycleObserver = GenericLifecycleObserver {
     source, event ->
        Log.d("LifeycycleFragment", "source:$source event:$event")
    }
    override fun onCreate(savedInstanceState: Bundle?) {
    
        super.onCreate(savedInstanceState)
        lifecycle.addObserver(mLifecycleObserver)
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
    
        return inflater.inflate(R.layout.fragment_lifecycle, container, false)
    }
    override fun onDestroy() {
    
        lifecycle.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值