[toc]
Lifecycle,顾名思义,是用于帮助开发者管理Activity和Fragment 的生命周期,它是LiveData和ViewModel的基础。
Lifecycle是一个库,也包含Lifecycle这样一个类,Lifecycle类 用于存储有关组件(如 Activity 或 Fragment) 的生命周期状态的信息,并允许其他对象观察此状态。
一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。 但是,这种模式会导致代码条理性很差而且会扩散错误。 通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中
如果项目已经依赖了AndroidX:
implementation 'androidx.appcompat:appcompat:1.3.0'
那么我们就可以使用Lifecycle库了,因为appcompat依赖了androidx.fragment, 而androidx.fragment下依赖了ViewModel和 LiveData, LiveData内部又依赖了Lifecycle。
相关配置: dependencies { def lifecycle_version = "2.3.1" def arch_version = "2.1.0"
// ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
// LiveData
implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
// Lifecycles only (without ViewModel or LiveData)
implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
// Saved state module for ViewModel
implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version"
// Annotation processor
kapt "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"
// alternately - if using Java8, use the following instead of lifecycle-compiler
implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"
// optional - helpers for implementing LifecycleOwner in a Service
implementation "androidx.lifecycle:lifecycle-service:$lifecycle_version"
// optional - ProcessLifecycleOwner provides a lifecycle for the whole application process
implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version"
// optional - ReactiveStreams support for LiveData
implementation "androidx.lifecycle:lifecycle-reactivestreams-ktx:$lifecycle_version"
// optional - Test helpers for LiveData
testImplementation "androidx.arch.core:core-testing:$arch_version"
}
## 1.2 使用方法
- 生命周期拥有者 使用getLifecycle()获取Lifecycle实例,然后代用addObserve()添加观察者;
- 观察者实现LifecycleObserver,方法上使用OnLifecycleEvent注解关注对应生命周期,生命周期触发时就会执行对应方法
### 1.1.1 在Activity(或Fragment)中使用
class JetpackActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(mBinding.root)
lifecycle.addObserver(LifeCycleObserverImp())
}
}
class LifeCycleObserverImp : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun start() { }
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun stop() {
}
}
Activity(或Fragment)是生命周期的拥有者,通过getLifecycle()方法获取到生命周期Lifecycle对象,
Lifecycle对象使用addObserver方法 给自己添加观察者,即MyObserver对象。
当Lifecycle的生命周期发生变化时,MyObserver就可以感知到
### 1.2.2 自定义LifecycleOwner
如果有一个自定义类并希望使其成为LifecycleOwner,可以使用LifecycleRegistry类,
它是Lifecycle的实现类,但需要将事件转发到该类:
class MyLifeCycleOwner : LifecycleOwner { private val mLifecycleRegistry: LifecycleRegistry by lazy { LifecycleRegistry(this) }
override fun getLifecycle(): Lifecycle {
return mLifecycleRegistry
}
fun init() {
mLifecycleRegistry.currentState = Lifecycle.State.CREATED
}
fun release() {
mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
}
class JetpackActivity : BaseActivity() {
private val myLfeCycleOwner = MyLifeCycleOwner()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(mBinding.root)
myLfeCycleOwner.lifecycle.addObserver(LifeCycleObserverImp())
myLfeCycleOwner.init()
}
override fun onDestroy() {
myLfeCycleOwner.release()
super.onDestroy()
}
}
### 1.2.3 Application生命周期 ProcessLifecycleOwner
之前对App进入前后台的判断是通过registerActivityLifecycleCallbacks(callback)方法,
然后在callback中利用一个全局变量做计数,
在onActivityStarted()中计数加1,在onActivityStopped方法中计数减1,从而判断前后台切换。
而使用ProcessLifecycleOwner可以直接获取应用前后台切换状态。(记得先引入lifecycle-process依赖)
class App : Application() { override fun onCreate() { super.onCreate() ProcessLifecycleOwner.get().lifecycle.addObserver(ProcessLifecycleObserver()) } }
class ProcessLifecycleObserver : LifecycleObserver { /** * 只会被调用一次 */ @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onCreate(owner: LifecycleOwner) { }
/**
* 应用程序出现到前台时调用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(owner: LifecycleOwner) {
}
/**
* 应用程序出现到前台时调用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(owner: LifecycleOwner) {
}
/**
* 应用程序退出到后台时调用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(owner: LifecycleOwner) {
}
/**
* 应用程序退出到后台时调用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(owner: LifecycleOwner) {
}
/**
* 永远不会被调用到,系统不会分发调用ON_DESTROY事件
* */
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(owner: LifecycleOwner) {
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
fun onAny(owner: LifecycleOwner, event: Lifecycle.Event) {
}
}
# 二、源码分析
LifecycleOwner(如Activity)在生命周期状态改变时(也就是生命周期方法执行时),
遍历观察者,获取每个观察者的方法上的注解,如果注解是@OnLifecycleEvent且value是和生命周期状态一致,那么就执行这个方法
## 2.1 Lifecycle
public abstract class Lifecycle { //添加观察者 @MainThread public abstract void addObserver(@NonNull LifecycleObserver observer); //移除观察者 @MainThread public abstract void removeObserver(@NonNull LifecycleObserver observer); //获取当前状态 public abstract State getCurrentState();
//生命周期事件,对应Activity生命周期方法
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY //可以响应任意一个事件
}
//生命周期状态. (Event是进入这种状态的事件)
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
//判断至少是某一状态
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
- Event
生命周期事件,这些事件对应Activity/Fragment生命周期方法。
- State
生命周期状态,而Event是指进入一种状态的事件。

## 2.2 Activity对LifecycleOwner的实现
//androidx.activity.ComponentActivity,这里忽略了一些其他代码,我们只看Lifecycle相关 public class ComponentActivity extends androidx.core.app.ComponentActivity implements LifecycleOwner{ ...
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
...
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSavedStateRegistryController.performRestore(savedInstanceState);
ReportFragment.injectIfNeededIn(this); //使用ReportFragment分发生命周期事件
if (mContentLayoutId != 0) {
setContentView(mContentLayoutId);
}
}
@CallSuper
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
Lifecycle lifecycle = getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).setCurrentState(Lifecycle.State.CREATED);
}
super.onSaveInstanceState(outState);
mSavedStateRegistryController.performSave(outState);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
## 2.3 生命周期事件分发 —— ReportFragment
//专门用于分发生命周期事件的Fragment public class ReportFragment extends Fragment {
public static void injectIfNeededIn(Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
//在API 29及以上,可以直接注册回调 获取生命周期
activity.registerActivityLifecycleCallbacks(
new LifecycleCallbacks());
}
//API29以前,使用fragment 获取生命周期
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
manager.executePendingTransactions();
}
}
@SuppressWarnings("deprecation")
static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {
if (activity instanceof LifecycleRegistryOwner) {//这里废弃了,不用看
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);//使用LifecycleRegistry的handleLifecycleEvent方法处理事件
}
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatch(Lifecycle.Event.ON_CREATE);
}
@Override
public void onStart() {
super.onStart();
dispatch(Lifecycle.Event.ON_START);
}
@Override
public void onResume() {
super.onResume();
dispatch(Lifecycle.Event.ON_RESUME);
}
@Override
public void onPause() {
super.onPause();
dispatch(Lifecycle.Event.ON_PAUSE);
}
...省略onStop、onDestroy
private void dispatch(@NonNull Lifecycle.Event event) {
if (Build.VERSION.SDK_INT < 29) {
dispatch(getActivity(), event);
}
}
//在API 29及以上,使用的生命周期回调
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
...
@Override
public void onActivityPostCreated(@NonNull Activity activity,@Nullable Bundle savedInstanceState) {
dispatch(activity, Lifecycle.Event.ON_CREATE);
}
@Override
public void onActivityPostStarted(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_START);
}
@Override
public void onActivityPostResumed(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_RESUME);
}
@Override
public void onActivityPrePaused(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_PAUSE);
}
...省略onStop、onDestroy
}
}
首先injectIfNeededIn()内进行了版本区分:
在API 29及以上 直接使用activity的registerActivityLifecycleCallbacks 直接注册了生命周期回调,
然后给当前activity添加了ReportFragment,注意这个fragment是没有布局的。
然后, 无论LifecycleCallbacks、还是fragment的生命周期方法
最后都走到了 dispatch(Activity activity, Lifecycle.Event event)方法,
其内部使用LifecycleRegistry的handleLifecycleEvent方法处理事件。
而**ReportFragment的作用就是获取生命周期而已**,因为fragment生命周期是依附Activity的。
好处就是把这部分逻辑抽离出来,实现activity的无侵入。
如果你对图片加载库Glide比较熟,就会知道它也是使用透明Fragment获取生命周期的
## 2.4 生命周期事件处理——LifecycleRegistry
//LifecycleRegistry.java //系统自定义的保存Observer的map,可在遍历中增删 private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>();
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);//获取event发生之后的将要处于的状态
moveToState(next);//移动到这个状态
}
private void moveToState(State next) {
if (mState == next) {
return;//如果和当前状态一致,不处理
}
mState = next; //赋值新状态
if (mHandlingEvent || mAddingObserverCounter != 0) {
mNewEventOccurred = true;
return;
}
mHandlingEvent = true;
sync(); //把生命周期状态同步给所有观察者
mHandlingEvent = false;
}
private void sync() {
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"
+ "garbage collected. It is too late to change lifecycle state.");
}
while (!isSynced()) { //isSynced()意思是 所有观察者都同步完了
mNewEventOccurred = false;
//mObserverMap就是 在activity中添加observer后 用于存放observer的map
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);
}
Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
if (!mNewEventOccurred && newest != null
&& mState.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred = false;
}
...
static State getStateAfter(Event event) {
switch (event) {
case ON_CREATE:
case ON_STOP:
return CREATED;
case ON_START:
case ON_PAUSE:
return STARTED;
case ON_RESUME:
return RESUMED;
case ON_DESTROY:
return DESTROYED;
case ON_ANY:
break;
}
throw new IllegalArgumentException("Unexpected event value " + event);
}
@Override public void addObserver(@NonNull LifecycleObserver observer) { State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED; //带状态的观察者,这个状态的作用:新的事件触发后 遍历通知所有观察者时,判断是否已经通知这个观察者了 ObserverWithState statefulObserver = new ObserverWithState(observer, initialState); ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver); //observer作为key,ObserverWithState作为value,存到mObserverMap
if (previous != null) {
return;//已经添加过,不处理
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
return;//lifecycleOwner退出了,不处理
}
//下面代码的逻辑:通过while循环,把新的观察者的状态 连续地 同步到最新状态mState。
//意思就是:虽然可能添加的晚,但把之前的事件一个个分发给你(upEvent方法),即粘性
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
State targetState = calculateTargetState(observer);//计算目标状态
mAddingObserverCounter++;
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
popParentState();
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer);
}
if (!isReentrance) {
sync();
}
mAddingObserverCounter--;
}
用 getStateAfter() 获取 event 发生之后的将要处于的状态(看前面那张图很好理解),
moveToState()是移动到新状态,
最后使用sync()把生命周期状态同步给所有观察者
