1、Lifecycle 简介
Android Jetpack
库中的一员,具备宿主生命周期感知能力的组件,它能持有组件(如 Activity
、Fragment
)生命周期状态信息,并且允许其它观察者监听宿主的状态。- 官方网站
- 官方文档
2、Lifecycle 配置与基本用法
2.1 依赖引入与配置
- 正常情况下无需单独引入
Lifecycle
相关库,因为androidx.appcompat:appcompat:1.4.1
会自带 Lifecycle
、LiveData
、ViewModel
等依赖库。 - 如果想单独引入
Lifecycle
或者其其它相关扩展库可如下操作:
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.4.1'
kapt 'androidx.lifecycle:lifecycle-compiler:2.4.1'
implementation 'androidx.lifecycle:lifecycle-common-java8:2.4.1'
implementation 'androidx.lifecycle:lifecycle-service:2.4.1'
implementation 'androidx.lifecycle:lifecycle-process:2.4.1'
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-reactivestreams-ktx:2.4.1'
testImplementation 'androidx.arch.core:core-testing:2.1.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-compose:2.4.1'
implementation 'androidx.lifecycle:lifecycle-viewmodel-savedstate:2.4.1'
2.2 基本用法
2.2.1 Lifecycle 简单使用
class TestObserver : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
Log.d("TestObserver", "onCreate: ")
}
override fun onStart(owner: LifecycleOwner) {
super.onStart(owner)
Log.d("TestObserver", "onStart: ")
}
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
Log.d("TestObserver", "onResume: ")
}
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
Log.d("TestObserver", "onPause: ")
}
override fun onStop(owner: LifecycleOwner) {
super.onStop(owner)
Log.d("TestObserver", "onStop: ")
}
override fun onDestroy(owner: LifecycleOwner) {
super.onDestroy(owner)
Log.d("TestObserver", "onDestroy: ")
}
}
class TestEventObserver : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_CREATE -> {
Log.d("TestEventObserver", "ON_CREATE: ")
}
Lifecycle.Event.ON_START -> {
Log.d("TestEventObserver", "ON_START: ")
}
Lifecycle.Event.ON_RESUME -> {
Log.d("TestEventObserver", "ON_RESUME: ")
}
Lifecycle.Event.ON_PAUSE -> {
Log.d("TestEventObserver", "ON_PAUSE: ")
}
Lifecycle.Event.ON_STOP -> {
Log.d("TestEventObserver", "ON_STOP: ")
}
Lifecycle.Event.ON_DESTROY -> {
Log.d("TestEventObserver", "ON_DESTROY: ")
}
}
}
}
class TestActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_test)
lifecycle.addObserver(TestObserver())
lifecycle.addObserver(Test3EventObserver())
lifecycle.addObserver(LifecycleEventObserver { source, event ->
when (event) {
Lifecycle.Event.ON_START -> {
Log.d("TestActivity", "ON_START: ")
}
Lifecycle.Event.ON_STOP -> {
Log.d("TestActivity", "ON_STOP: ")
}
}
})
}
}
2.2.2 普通 Activity 实现 Lifecycle
class TestActivity : Activity(), LifecycleOwner {
private lateinit var mLifecycleRegistry: LifecycleRegistry
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
mLifecycleRegistry = LifecycleRegistry(this)
mLifecycleRegistry.currentState = Lifecycle.State.CREATED
lifecycle.addObserver(LifecycleEventObserver { source, event ->
when (event) {
Lifecycle.Event.ON_START -> {
Log.d("TestActivity", "ON_START: ")
}
Lifecycle.Event.ON_STOP -> {
Log.d("TestActivity", "ON_STOP: ")
}
}
})
}
override fun getLifecycle(): Lifecycle {
return mLifecycleRegistry
}
override fun onStart() {
super.onStart()
mLifecycleRegistry.currentState = Lifecycle.State.STARTED
}
override fun onPause() {
super.onPause()
mLifecycleRegistry.currentState = Lifecycle.State.STARTED
}
override fun onDestroy() {
super.onDestroy()
mLifecycleRegistry.currentState = Lifecycle.State.DESTROYED
}
}
2.2.3 ProcessLifecycleOwner 实现前后台切换
- 使用
ProcessLifecycleOwner
可以直接获取应用前后台切换状态(记得引入lifecycle-process
依赖)
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(ApplicationLifecycleObserver())
}
private class ApplicationLifecycleObserver : LifecycleEventObserver {
override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
when (event) {
Lifecycle.Event.ON_START -> {
Log.d("MyApplication", "onStateChanged: 应用程序移至前台")
}
Lifecycle.Event.ON_STOP -> {
Log.d("MyApplication", "onStateChanged: 应用程序移至后台")
}
}
}
}
}
3、Lifecycle 源码解析
3.1 Fragment 实现 Lifecycle
public class Fragment implements ComponentCallbacks, View.OnCreateContextMenuListener, LifecycleOwner,
ViewModelStoreOwner, HasDefaultViewModelProviderFactory, SavedStateRegistryOwner,
ActivityResultCaller {
...
LifecycleRegistry mLifecycleRegistry;
public Fragment() {
initLifecycle();
}
private void initLifecycle() {
mLifecycleRegistry = new LifecycleRegistry(this);
}
@Override
@NonNull
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
void performCreate(Bundle savedInstanceState) {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
}
void performStart() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
if (mView != null) {
mViewLifecycleOwner.handleLifecycleEvent(Lifecycle.Event.ON_START);
}
}
.....
void performDestroy() {
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
}
...
}
3.2 Activity 实现 Lifecycle
- 在介绍
Activity
实现 Lifecycle
之前,先简单了解下几个核心角色: Lifecycle
:一个抽象类,持有组件生命周期状态(如 Activity
或 Fragment
)的信息的类,并允许其他对象观察此状态。其宿主生命周期与宿主状态的对应关系如下:
![Lifecycle 宿主生命周期与状态模型图](https://img-blog.csdnimg.cn/ccb50a3a22a94b3abe587f392e2cfb0c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAeGluZy50YW5n,size_20,color_FFFFFF,t_70,g_se,x_16)
LifecycleOwner
:Lifecycle
被观察者(持有者),实现该接口的类持有生命周期(Lifecycle
对象),该接口的生命周期(Lifecycle
对象)的改变会被其注册的观察者 LifecycleObserver 观察到并触发其对应的事件。LifecycleObserver
:Lifecycle
观察者,实现该接口的类,可以通过被 LifecycleOwner
类的 addObserver()
方法注册,被注册后 LifecycleObserver
便可以观察到 LifecycleOwner
的生命周期事件。LifycycleRegistry
:Lifecycle
是一个抽象类,其唯一实现类是 LifecycleRegistry
,用来管理观察者和被观察者,并处理来自 LifeCycleOwner
的事件,然后再进行状态同步并通知所有的观察者。
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
ContextAware,
LifecycleOwner,
ViewModelStoreOwner,
HasDefaultViewModelProviderFactory,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner,
ActivityResultRegistryOwner,
ActivityResultCaller {
...
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
mSavedStateRegistryController.performRestore(savedInstanceState);
mContextAwareHelper.dispatchOnContextAvailable(this);
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
if (mContentLayoutId != 0) {
setContentView(mContentLayoutId);
}
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
...
}
- 由上述可知
ComponentActivity
是通过 ReportFragment
来实现对应其的生命周期感知能力,接着我们来看看 ReportFragment
源码。
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class ReportFragment extends android.app.Fragment {
private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle"
+ ".LifecycleDispatcher.report_fragment_tag";
public static void injectIfNeededIn(Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
androidx.lifecycle.ReportFragment.LifecycleCallbacks.registerIn(activity);
}
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new androidx.lifecycle.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);
}
}
}
static androidx.lifecycle.ReportFragment get(Activity activity) {
return (androidx.lifecycle.ReportFragment) activity.getFragmentManager().findFragmentByTag(
REPORT_FRAGMENT_TAG);
}
private androidx.lifecycle.ReportFragment.ActivityInitializationListener mProcessListener;
private void dispatchCreate(androidx.lifecycle.ReportFragment.ActivityInitializationListener listener) {
if (listener != null) {
listener.onCreate();
}
}
private void dispatchStart(androidx.lifecycle.ReportFragment.ActivityInitializationListener listener) {
if (listener != null) {
listener.onStart();
}
}
private void dispatchResume(androidx.lifecycle.ReportFragment.ActivityInitializationListener listener) {
if (listener != null) {
listener.onResume();
}
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
dispatch(Lifecycle.Event.ON_CREATE);
}
@Override
public void onStart() {
super.onStart();
dispatchStart(mProcessListener);
dispatch(Lifecycle.Event.ON_START);
}
@Override
public void onResume() {
super.onResume();
dispatchResume(mProcessListener);
dispatch(Lifecycle.Event.ON_RESUME);
}
@Override
public void onPause() {
super.onPause();
dispatch(Lifecycle.Event.ON_PAUSE);
}
@Override
public void onStop() {
super.onStop();
dispatch(Lifecycle.Event.ON_STOP);
}
@Override
public void onDestroy() {
super.onDestroy();
dispatch(Lifecycle.Event.ON_DESTROY);
mProcessListener = null;
}
private void dispatch(@NonNull Lifecycle.Event event) {
if (Build.VERSION.SDK_INT < 29) {
dispatch(getActivity(), event);
}
}
void setProcessListener(androidx.lifecycle.ReportFragment.ActivityInitializationListener processListener) {
mProcessListener = processListener;
}
interface ActivityInitializationListener {
void onCreate();
void onStart();
void onResume();
}
@RequiresApi(29)
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
static void registerIn(Activity activity) {
activity.registerActivityLifecycleCallbacks(new androidx.lifecycle.ReportFragment.LifecycleCallbacks());
}
@Override
public void onActivityCreated(@NonNull Activity activity,
@Nullable Bundle bundle) {
}
@Override
public void onActivityPostCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
dispatch(activity, Lifecycle.Event.ON_CREATE);
}
@Override
public void onActivityStarted(@NonNull Activity activity) {
}
@Override
public void onActivityPostStarted(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_START);
}
@Override
public void onActivityResumed(@NonNull Activity activity) {
}
@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);
}
@Override
public void onActivityPaused(@NonNull Activity activity) {
}
@Override
public void onActivityPreStopped(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_STOP);
}
@Override
public void onActivityStopped(@NonNull Activity activity) {
}
@Override
public void onActivitySaveInstanceState(@NonNull Activity activity,
@NonNull Bundle bundle) {
}
@Override
public void onActivityPreDestroyed(@NonNull Activity activity) {
dispatch(activity, Lifecycle.Event.ON_DESTROY);
}
@Override
public void onActivityDestroyed(@NonNull Activity activity) {
}
}
}
- 通过上述代码可知在
injectIfNeededIn(activity)
方法中,如果是 Android 10
及以上,通过 registerActivityLifecycleCallbacks
的方式来实现生命周期的回调,如果是 Android 10
以下,则通过向 Activity
添加一个不可见的 Fragment
,以此来获取 Activity
的生命周期事件正确回调。根据代码流程两者最终都调用了 ReportFragment#dispatch()
方法,然后方法内部最终又调用了 LifecycleRegistry#handleLifecycleEvent()
方法来处理生命周期事件。
3.3 Lifecycle 添加观察者
public class LifecycleRegistry extends Lifecycle {
...
private State mState;
private final WeakReference<LifecycleOwner> mLifecycleOwner;
public LifecycleRegistry(@NonNull LifecycleOwner provider) {
this(provider, true);
}
private LifecycleRegistry(@NonNull LifecycleOwner provider, boolean enforceMainThread) {
mLifecycleOwner = new WeakReference<>(provider);
mState = INITIALIZED;
mEnforceMainThread = enforceMainThread;
}
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
enforceMainThreadIfNeeded("addObserver");
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
if (previous != null) {
return;
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
return;
}
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
final Event event = Event.upFrom(statefulObserver.mState);
if (event == null) {
throw new IllegalStateException("no event up from " + statefulObserver.mState);
}
statefulObserver.dispatchEvent(lifecycleOwner, event);
popParentState();
targetState = calculateTargetState(observer);
}
if (!isReentrance) {
sync();
}
mAddingObserverCounter--;
}
private State calculateTargetState(LifecycleObserver observer) {
Map.Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);
State siblingState = previous != null ? previous.getValue().mState : null;
State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
: null;
return min(min(mState, siblingState), parentState);
}
static class ObserverWithState {
State mState;
LifecycleEventObserver mLifecycleObserver;
ObserverWithState(LifecycleObserver observer, State initialState) {
mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
mState = initialState;
}
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = event.getTargetState();
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
}
...
}
- 通过上述代码可知:
- (1)计算初始状态,如果当前
Lifecycle
状态不为 DESTROYED
,我们就设置为初始状态; - (2)将传入的
observer
对象包装为 ObserverWithState
,判断 observer
是否已添加到 map
数据中; - (3)若未添加到
map
中,计算当前 Lifecycle的State
,通过循环检查方式向 ObserverWithState
逐步下发 Event
值; - (4)最终调用
sync()
方法,尝试同步其它观察者的生命周期状态。
3.4 Lifecycle 分发观察者状态
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
enforceMainThreadIfNeeded("handleLifecycleEvent");
moveToState(event.getTargetState());
}
private void moveToState(State next) {
if (mState == next) {
return;
}
mState = next;
if (mHandlingEvent || mAddingObserverCounter != 0) {
mNewEventOccurred = true;
return;
}
mHandlingEvent = true;
sync();
mHandlingEvent = false;
}
private boolean isSynced() {
if (mObserverMap.size() == 0) {
return true;
}
State eldestObserverState = mObserverMap.eldest().getValue().mState;
State newestObserverState = mObserverMap.newest().getValue().mState;
return eldestObserverState == newestObserverState && mState == newestObserverState;
}
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()) {
mNewEventOccurred = false;
if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
backwardPass(lifecycleOwner);
}
Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
if (!mNewEventOccurred && newest != null
&& mState.compareTo(newest.getValue().mState) > 0) {
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred = false;
}
private void forwardPass(LifecycleOwner lifecycleOwner) {
Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
mObserverMap.iteratorWithAdditions();
while (ascendingIterator.hasNext() && !mNewEventOccurred) {
Map.Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
ObserverWithState observer = entry.getValue();
while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
&& mObserverMap.contains(entry.getKey()))) {
pushParentState(observer.mState);
final Event event = Event.upFrom(observer.mState);
if (event == null) {
throw new IllegalStateException("no event up from " + observer.mState);
}
observer.dispatchEvent(lifecycleOwner, event);
popParentState();
}
}
}
private void backwardPass(LifecycleOwner lifecycleOwner) {
Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
mObserverMap.descendingIterator();
while (descendingIterator.hasNext() && !mNewEventOccurred) {
Map.Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
ObserverWithState observer = entry.getValue();
while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
&& mObserverMap.contains(entry.getKey()))) {
Event event = Event.downFrom(observer.mState);
if (event == null) {
throw new IllegalStateException("no event down from " + observer.mState);
}
pushParentState(event.getTargetState());
observer.dispatchEvent(lifecycleOwner, event);
popParentState();
}
}
}
- 通过上述代码可知:
- 就是根据下发的观察者状态,推导出当前目标的观察者状态,然后根据目标观察者状态过滤出所有未同步的观察者,并调用循环和其对应的判断条件,来进行向前或向后的分发事件,从而实现同步所有的观察者。
4、Lifecycle 总结
- (1)
Lifecycle
的核心设计模式就是观察者模式,LifeCycleOwner
是被观察者,LifecycleObserver
是观察者,LifecycleRegistry
用来管理观察者和被观察者,并处理来自 LifeCycleOwner
的事件,然后再进行状态同步并通知所有的观察者。 - (2)
Fragment
是通过实现 LifeCycleOwner
接口,并在 Fragment
中的 performCreate()
、performResume()
等方法中调用 LifecycleRegistry
类的 handleLifecycleEvent()
方法来下发生命周期事件。 - (3)而
Activity
则是在其基类的 ComponentActivity
中的 onCreate()
方法通过 ReportFragment
的注入来实现对其生命周期的感知。 - (4)
Lifecycle
添加观察者,都会调用到 LifecycleRegistry
类的 addObserver()
方法,首先计算初始状态,如果当前 Lifecycle
状态不为 DESTROYED
状态,我们就设置为初始状态;然后将传入的 observer
对象包装为 ObserverWithState
,判断 observer
是否已添加到 map
集合数据中;若未添加到 map
集合中,计算当前 Lifecycle
的 State
,通过循环检查方式向 ObserverWithState
逐步下发 Event
值;最终调用 sync()
方法,尝试同步其它观察者的生命周期状态。 - (5)
Lifecycle
分发观察者状态,都会调用到 LifecycleRegistry
类的 handleLifecycleEvent()
方法,其实就是根据下发的观察者状态,推导出当前目标的观察者状态,然后根据目标观察者状态过滤出所有未同步的观察者,并调用循环和其对应的判断条件,来进行向前或向后的分发事件,从而实现同步所有的观察者。 - (6)这里需要注意的一点是,
Lifecycle
有状态倒灌过程,也就是在任意生命周期中注册 LifecycleObserver
,这个 LifecycleObserver
会把前面的生命周期回调都执行一遍,直到和注册时的生命周期状态同步。
5、Lifecycle 相关问题
5.1 Activity 是如何实现 Lifecycle 的事件分发的?
ComponentActivity
通过不可见的 ReportFragment
注入来实现,低版本的 Activity
,即没有继承 ComponentActivity
的 Activity
类需要通过实现 LifecycleOwner
来自行实现。
5.2 Activity 为什么不内部实现而是引入 ReportFragment 呢?
- 主要是为了兼顾不是继承自
AppCompactActivity
的使用场景。
5.3 在 onResume() 方法中注册的观察者是否能够接收到完整的生命周期事件?
- 能,因为
Lifecycle
有状态倒灌过程,也就是在任意生命周期中注册 LifecycleObserver
,这个 LifecycleObserver
会把前面的生命周期回调都执行一遍,直到和注册时的生命周期状态同步。
5.4 @OnLifecycleEvent 为什么被废弃?
- 在
Lifecycle
的 2.4.0
版本,将 @OnLifecycleEvent
注解废弃了,官方建议用 LifecycleEventObserver
或者 DefaultLifecycleObserver
替代。 - 因为注解要么依赖反射,会降低运行时性能,要么依靠
APT
,降低编译速度。