美文网首页
Android 架构组件之 Lifecycle/Lifecycl

Android 架构组件之 Lifecycle/Lifecycl

作者: 行走中的3卡 | 来源:发表于2022-10-31 15:12 被阅读0次

在前面的文章,有写过 Android 架构组件 (Lifecycle/ViewModel/LiveData) 初识指南
只是简单的介绍了一下Lifecycle, 并未涉及源码.
所以,今天复习一遍,阅读一下源码, 加深理解.

1. Lifecycle 生命周期

定义具有 Android 生命周期的对象。
Fragment 和 FragmentActivity 类实现了 LifecycleOwner 接口,该接口具有访问生命周期的 getLifecycle 方法。
还可以在自己的类中实现 LifecycleOwner 。
(LifecycleOwner在后面会介绍)

此类中的Lifecycle.Event.ON_CREATE、Lifecycle.Event.ON_START Lifecycle.Event.ON_RESUME事件,
在 生命周期所有者(LifecycleOwner) 的相关方法 返回后 调度。
在调用 生命周期所有者 的相关方法之前调度此类中的Lifecycle.Event.ON_PAUSE、Lifecycle.Event.ON_STOP Lifecycle.Event.ON_DESTROY事件。
例如,Lifecycle.Event.ON_START将在 onStart 返回后调度,Lifecycle.Event.ON_STOP将在调用 onStop 之前调度。这为您提供了某些保证所有者处于哪种状态。

观察生命周期事件,请调用 addObserver(LifecycleObserver)
传递实现 DefaultLifecycleObserver 或 LifecycleEventObserver 的对象。

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();
    
    @SuppressWarnings("WeakerAccess")
    public enum Event {
        /**
         * Constant for onCreate event of the {@link LifecycleOwner}.
         */
        ON_CREATE,
        /**
         * Constant for onStart event of the {@link LifecycleOwner}.
         */
        ON_START,
        //...   

        @Nullable
        public static Event upFrom(@NonNull State state) {  ...}
        public static Event upTo(@NonNull State state) {...}        
    }
    
     public enum State { 
         DESTROYED,
         INITIALIZED,
         ...
     }
     
     public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
     }   
}

其中, Lifecycle states(状态) 与 Lifecycle Event 之间的关系:
可以将state视为图形中的节点,将Event视为这些节点之间的

2. LifecycleRegistry 生命周期注册表

Lifecycle的实现类,可以处理多个观察者.
被Fragments/ Activities 使用。也可以直接自定义一个 LifecycleOwner.
持有 LifecycleOwner(弱引用)

public class LifecycleRegistry extends Lifecycle {
    private State mState;
    private final WeakReference<LifecycleOwner> mLifecycleOwner;
    
    public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        this(provider, true);
    }
}

3. LifecycleOwner 生命周期所有者

具有 Android 生命周期的类
自定义组件 可以使用这些 事件 来处理 生命周期更改,
而无需在Activity /Fragment 中实现任何代码。

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

例如,在ComponentActivity 会实现这个接口,然后返回它的成员变量 mLifecycleRegistry.

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        ContextAware,
        LifecycleOwner,
         ... {
    private final LifecycleRegistry mLifecycleRegistry 
    = new LifecycleRegistry(this);

    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}

4. LifecycleObserver 生命周期观察者

将类标记为 生命周期观察者。
不要直接使用此接口!!!!
而是实现 DefaultLifecycleObserver 或 LifecycleEventObserver 来接收有关生命周期事件的通知。

4.1 DefaultLifecycleObserver 默认 生命周期 观察者

用于侦听 生命周期所有者 状态更改 的回调接口。
如果一个类同时实现了此接口和 LifecycleEventObserver,则首先调用 DefaultLifecycleObserver 的方法,
然后调用 LifecycleEventObserver.onStateChanged(LifecycleOwner, Lifecycle.Event)
如果一个类实现了这个接口,同时使用 OnLifecycleEvent,那么注释被忽略

public interface DefaultLifecycleObserver extends FullLifecycleObserver {
     //....
}

基类:FullLifecycleObserver

interface FullLifecycleObserver extends LifecycleObserver {

    void onCreate(LifecycleOwner owner);

    void onStart(LifecycleOwner owner);

    void onResume(LifecycleOwner owner);

    void onPause(LifecycleOwner owner);

    void onStop(LifecycleOwner owner);

    void onDestroy(LifecycleOwner owner);
}

4.2 LifecycleEventObserver 生命周期事件观察器

可以接收任何 生命周期 更改 并将其调度给 接收方的类。
如果一个类同时实现了此接口和 DefaultLifecycleObserver,则将首先调用 DefaultLifecycle Observer 的方法,
然后调用 onStateChanged(LifecycleOwner, Lifecycle.Event)
如果一个类实现了这个接口,同时使用 OnLifecycleEvent,那么注释将被忽略。

public interface LifecycleEventObserver extends LifecycleObserver {
    /**
     * Called when a state transition event happens.
     *
     * @param source The source of the event
     * @param event The event
     */
    void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}

-----------------End ---------------------

相关文章

网友评论

      本文标题:Android 架构组件之 Lifecycle/Lifecycl

      本文链接:https://www.haomeiwen.com/subject/hmqltdtx.html