1.Lifecycle的生命周期状态事件和状态
Lifecycle使用两个枚举来跟踪其关联组件的生命周期状态,这两个枚举分别是Event和State。
State指的是Lifecycle的生命周期所处的状态。
Event代表Lifecycle生命周期对应的事件,这些事件会映射到Activity和Fragment中的回调事件中。
Android 9.0的Lifecycle的源码如下所示。
frameworks/support/lifecycle/common/src/main/java/androidx/lifecycle/Lifecycle.java
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 {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
@SuppressWarnings(“WeakerAccess”)
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
Lifecycle是一个抽象类,其内部不仅包括了添加和移除观察者的方法,还包括了此前说到的Event和State枚举。可以看到Event中的事件和Activity的生命周期几乎是对应的,除了ON_ANY,它可用于匹配所有事件。
State与Event的关系入下面的时序图所示。
一文带你掌握Lifecycle的原理
2.Lifecycle如何观察Activity和Fragment的生命周期
在Android Support Library 26.1.0 及其之后的版本,Activity和Fragment已经默认实现了LifecycleOwner接口,LifecycleOwner可以理解为被观察者,那么Lifecycle是如何观察Activity和Fragment的生命周期的呢?
在上一篇文章举的例子中,MainActivity继承了AppCompatActivity,而AppCompatActivity继承了FragmentActivity。在Android 8.0时,FragmentActivity继承自SupportActivity,而在Android 9.0,FragmentActivity继承自ComponentActivity 。SupportActivity和ComponentActivity的代码区别不大,这里以ComponentActivity举例,如下所示。
frameworks/support/compat/src/main/java/androidx/core/app/ComponentActivity.java
@RestrictTo(LIBRARY_GROUP)
public class ComponentActivity extends Activity implements LifecycleOwner {
private SimpleArrayMap<Class<? extends ExtraData>, ExtraData> mExtraDataMap =
new SimpleArrayMap<>();
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);//1
@RestrictTo(LIBRARY_GROUP)
public void putExtraData(ExtraData extraData) {
mExtraDataMap.put(extraData.getClass(), extraData);
}
@Override
@SuppressWarnings(“RestrictedApi”)
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);//2
}
@CallSuper
@Override
protected void onSaveInstanceState(Bundle outState) {
mLifecycleRegistry.markState(Lifecycle.State.CREATED);//3
super.onSaveInstanceState(outState);
}
@RestrictTo(LIBRARY_GROUP)
public T getExtraData(Class extraDataClass) {
return (T) mExtraDataMap.get(extraDataClass);
}
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;//4
}
@RestrictTo(LIBRARY_GROUP)
public static class ExtraData {
}
}
注释1处创建了LifecycleRegistry&#x