在前面的文章,有写过 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 ---------------------
网友评论