Lifecycle是Google推出的一个可以感知(Activity/Fragment)等组件生命周期的一个组件。使用Lifecycle,,可以避免在(Activity/Fragment)生命周期函数里写过多的逻辑代码,可以使我们的业务逻辑更加的解耦。下面介绍Lifecycle的使用以及原理。
LiveData详解
ViewModel详解
一:添加依赖
dependencies {
def lifecycle_version = "2.2.0"
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"
}
根据自己所需要的去添加依赖
二:使用
2.1:ProcessLifecycleOwner(监听整个应用的生命周期)
我们可以通过ProcessLifecycleOwner监听应用处于前台,还是后台。代码如下:
class MApp :Application(){
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())
}
}
class AppLifecycleObserver :LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onAppBackgound(){
Log.e("ccm","====AppLifecycleObserver=====onAppBackgound==")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onAppForeground(){
Log.e("ccm","====AppLifecycleObserver=====onAppForeground==")
}
}
- 在applicatioin的onCreate方法里使用ProcessLifecycleOwner.get().lifecycle.addObserver(AppLifecycleObserver())添加监听
- AppLifecycleObserver实现LifecycleObserver。
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)注解的onAppBackgound()方法,会在应用进入后台的时候调用。 @OnLifecycleEvent(Lifecycle.Event.ON_START)onAppForeground()方法,会在应用进入前台的时候调用。 如上就实现了对应用进入前后台的监听。
2.2:监听Activity/Fragment的生命周期
以前我们经常在Activity的onDestroy里去释放一些资源。如果业务逻辑一多,那么对应的onDestroy里的代码也会很多,难以维护。而有了Lifecycle,我们可以使用Lifecycle去解耦这些逻辑代码,使Activity跟Fragment更加的干净。 下面是一个简单的监听Activity声明周期的例子:
class LearnLifeCycleActivity :AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_learnlifecycle)
lifecycle.addObserver(LearnLifecycleObserver())
}
}
class LearnLifecycleObserver :LifecycleObserver{
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(){
Log.e("ccm","===LearnLifecycleObserver==onCreate====")
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(){
Log.e("ccm","===LearnLifecycleObserver==onStart====")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(){
Log.e("ccm","===LearnLifecycleObserver==onResume====")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(){
Log.e("ccm","===LearnLifecycleObserver==onPause====")
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(){
Log.e("ccm","===LearnLifecycleObserver==onStop====")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(){
Log.e("ccm","===LearnLifecycleObserver==onDestroy====")
}
}
- lifecycle.addObserver(LearnLifecycleObserver()) 在Activity里使用该代码添加观察
- LearnLifecycleObserver类实现LifecycleObserver,并且通过注解@OnLifecycleEvent,就可以去监听Activity的onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy()方法。 使用起来很简单,下面再写个实战的例子。比如我们的代码经常会使用Handler,并且在onDestroy里去让Handler.removeCallbacksAndMessages。这块现在我们就可以通过Lifecycle解耦出来。如下:
class LifecycleHandler(val lifecycleOwner:LifecycleOwner) :Handler(),LifecycleObserver{
init {
addObserver()
}
private fun addObserver(){
lifecycleOwner.lifecycle.addObserver(this)
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
private fun onDestroy(){
removeCallbacksAndMessages(null)
lifecycleOwner.lifecycle.removeObserver(this)
}
}
- LifecycleHandler类继承Handler,实现LifecycleObserver
- 在初始化时候lifecycleOwner.lifecycle.addObserver(this) 添加观察
- @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) 接收到onDestroy之后,去 removeCallbacksAndMessages(null)跟lifecycleOwner.lifecycle.removeObserver(this)删除观察 如上就是一个简单的例子。Lifecycle使用起来很简单,那么Lifecycle如何去做到能够监听组件(如Activity/Fragment)的生命周期的呢,下面我们通过源码的解析来进行分析。
三:源码解析
上面例子中,来看LearnLifeCycleActivity的代码:
class LearnLifeCycleActivity :AppCompatActivity(){
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_learnlifecycle)
lifecycle.addObserver(LearnLifecycleObserver())
}
}
点进lifecycle具体看看lifecycle是什么?跳转到ComponentActivity的
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
...
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
我们发现其实lifecycle就是LifecycleRegistry,而调用lifecycle.addObserver方法其实就是调用LifecycleRegistry的addObserver方法。 这时候,我们先暂停一下,先来看看LifecycleRegistry是什么
public class LifecycleRegistry extends Lifecycle {
...
}
LifecycleRegistry继承Lifecycle,LifecycleRegistry是Lifecycle的唯一实现类,来看看Lifecycle的代码
public abstract class Lifecycle {
public abstract void addObserver(@NonNull LifecycleObserver observer);
public abstract void removeObserver(@NonNull LifecycleObserver observer);
public abstract State getCurrentState();
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY
}
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED
}
}
- Lifecycle主要有三个方法抽象方法addObserver,removeObserver,getCurrentState
- 两个枚举类Event,State。 我们来看看Lifecycle官网的一张图,来展示Event跟State的关系的。
State 是节点, Event 是连接每个节点的线。Event的值是完全按 Activity 的生命周期来理解,都是一一对应的,State 看起来是缺失了 PAUSED、STOPED,其实它的 PAUSED 就是 STARTED,STOPED 是 CREATED。总的来说,Event 就是改变生命周期的事件,State 是目前 Activity/Fragment 所处生命周期的状态\
有了对Lifecycle的了解之后,并且LifecycleRegistry是Lifecycle的唯一实现来,接下来我们回过头来看之前遗留的LifecycleRegistry的addObserver方法。
...
private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
new FastSafeIterableMap<>();
...
@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);
if (previous != null) {
return;
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
// it is null we should be destroyed. Fallback quickly
return;
}
...
}
- State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED; //初始化State状态
- ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);把State状态跟observer观察者。作为参数传入ObserverWithState,构建ObserverWithState的实例。
ObserverWithState是持有State跟Observer的对象。接着看Lifecycling.lifecycleEventObserver(observer); 方法static class ObserverWithState { State mState; LifecycleEventObserver mLifecycleObserver; ObserverWithState(LifecycleObserver observer, State initialState) { mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer); mState = initialState; } ... }传进来的observer其实又被ReflectiveGenericLifecycleObserver包了一层,接着看看ReflectiveGenericLifecycleObserverstatic LifecycleEventObserver lifecycleEventObserver(Object object) { ... return new ReflectiveGenericLifecycleObserver(object); }再来看看CallbackInfo是什么,ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver { private final Object mWrapped; private final CallbackInfo mInfo; ReflectiveGenericLifecycleObserver(Object wrapped) { mWrapped = wrapped; mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass()); } @Override public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) { mInfo.invokeCallbacks(source, event, mWrapped); } }我们可以看到 method.getAnnotation(OnLifecycleEvent.class);annotation.value();去解析了注解,并且获取值,并且存储集合最终都封装到CallbackInfo这个类中。CallbackInfo getInfo(Class<?> klass) { CallbackInfo existing = mCallbackMap.get(klass); if (existing != null) { return existing; } existing = createInfo(klass, null); return existing; } private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) { ... Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass); boolean hasLifecycleMethods = false; for (Method method : methods) { OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class); if (annotation == null) { continue; } ... Lifecycle.Event event = annotation.value(); ... MethodReference methodReference = new MethodReference(callType, method); verifyAndPutHandler(handlerToEvent, methodReference, event, klass); } CallbackInfo info = new CallbackInfo(handlerToEvent); mCallbackMap.put(klass, info); mHasLifecycleMethods.put(klass, hasLifecycleMethods); return info; } - mObserverMap.putIfAbsent(observer, statefulObserver); mObserverMaps是个HashMap集合,把observer跟statefulObserver键值对形式存储到集合中。 到这里总结一下,addObserver做了什么。
- 第一步是构建了ObserverWithState类,并且ObserverWithState包含State跟传入的Observer对象,而这个传入的Observer其实又被ReflectiveGenericLifecycleObserver包装了一层,并且ReflectiveGenericLifecycleObserver里还包含了CallbackInfo。CallbackInfo类主要是解析了传入的Observer类的@OnLifecycleEvent注解对应的信息并保存着
- 将ObserverWithState跟传入的Observer类存入FastSafeIterableMap集合
到这里,我们分析完了addObserver方法做的事情,再回过头来看看getLifecycle()方法,我们的getLifecycle()方法是在ComponentActivity里,而我们的LearnLifeCycleActivity都是继承ComponentActivity
public class ComponentActivity extends androidx.core.app.ComponentActivity implements LifecycleOwner,ViewModelStoreOwner, SavedStateRegistryOwner, OnBackPressedDispatcherOwner {
...
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSavedStateRegistryController.performRestore(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
if (mContentLayoutId != 0) {
setContentView(mContentLayoutId);
}
}
}
ComponentActivity实现了LifecycleOwner,并且在ComponentActivity的onCreate方法里有个ReportFragment.injectIfNeededIn(this);
public static void injectIfNeededIn(Activity activity) {
if (Build.VERSION.SDK_INT >= 29) {
// On API 29+, we can register for the correct Lifecycle callbacks directly
activity.registerActivityLifecycleCallbacks(
new LifecycleCallbacks());
}
// Prior to API 29 and to maintain compatibility with older versions of
// ProcessLifecycleOwner (which may not be updated when lifecycle-runtime is updated and
// need to support activities that don't extend from FragmentActivity from support lib),
// use a framework fragment to get the correct timing of Lifecycle events
android.app.FragmentManager manager = activity.getFragmentManager();
if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {
manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();
// Hopefully, we are the first to make a transaction.
manager.executePendingTransactions();
}
}
我们可以看到API29以上都会去注册一个LifecycleCallbacks,并且不管哪个API都会去添加一个new ReportFragment() 先来看LifecycleCallbacks
// this class isn't inlined only because we need to add a proguard rule for it. (b/142778206)
static class LifecycleCallbacks implements Application.ActivityLifecycleCallbacks {
@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) {
}
}
我们发现LifecycleCallbacks里是对Activity的生命周期的监听,并且在相应的生命周期里都调用了dispatch方法,只是传入的事件是对应声明周期的事件(如:dispatch(activity, Lifecycle.Event.ON_DESTROY)),在来看看ReportFragment这个Fragment
...
@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);
// just want to be sure that we won't leak reference to an activity
mProcessListener = null;
}
...
private void dispatch(@NonNull Lifecycle.Event event) {
if (Build.VERSION.SDK_INT < 29) {
// Only dispatch events from ReportFragment on API levels prior
// to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks
// added in ReportFragment.injectIfNeededIn
dispatch(getActivity(), event);
}
}
我们发现在ReportFragment的生命周期里也都调用了dispatch这个方法,并且传入对应的生命周期事件(如:dispatch(Lifecycle.Event.ON_DESTROY);)接着我们来看看dispatch的方法
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);
}
}
}
我们看到代码会判断activity是否是LifecycleOwner类型,并且lifecycle是否是LifecycleRegistry,接着会调用 LifecycleRegistry的handleLifecycleEvent方法。并且事件作为参数传入。根据我们上面查看的源码,ComponentActivity是实现了LifecycleOwner,并且lifecycle就是LifecycleRegistry。所以来看看LifecycleRegistry的handleLifecycleEvent方法
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
State next = getStateAfter(event);是将Event转成State。Event跟State之前前面有张关系图
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);
}
moveToState(next);主要是调用sync方法
private void moveToState(State next) {
...
sync();
...
}
sync方法如下:
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;
// no need to check eldest for nullability, because isSynced does it for us.
// 生命周期后退逻辑
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;
}
根据 State 的状态会有前进、后退两种逻辑,前进就是生命周期状态和事件图中从左往右的线路,后退就是生命周期状态和事件图从右往左的线路,看下backwardPass逻辑:
private void backwardPass(LifecycleOwner lifecycleOwner) {
Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
mObserverMap.descendingIterator();
while (descendingIterator.hasNext() && !mNewEventOccurred) {
Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
ObserverWithState observer = entry.getValue();
while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
&& mObserverMap.contains(entry.getKey()))) {
Event event = downEvent(observer.mState);
pushParentState(getStateAfter(event));
observer.dispatchEvent(lifecycleOwner, event);
popParentState();
}
}
}
关键代码是observer.dispatchEvent(lifecycleOwner, event);调到了ObserverWithState的dispatchEvent方法
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
调用到了mLifecycleObserver.onStateChanged(owner, event);我们上面分析过mLifecycleObserver的实现类是ReflectiveGenericLifecycleObserver,所以来看ReflectiveGenericLifecycleObserver的onStateChanged方法
...
private final CallbackInfo mInfo;
...
ReflectiveGenericLifecycleObserver(Object wrapped) {
mWrapped = wrapped;
mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());
}
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) {
mInfo.invokeCallbacks(source, event, mWrapped);
}
又调用到了mInfo.invokeCallbacks(source, event, mWrapped);来看看CallbackInfo的invokeCallbacks方法
void invokeCallbacks(LifecycleOwner source, Lifecycle.Event event, Object target) {
invokeMethodsForEvent(mEventToHandlers.get(event), source, event, target);
invokeMethodsForEvent(mEventToHandlers.get(Lifecycle.Event.ON_ANY), source, event,
target);
}
private static void invokeMethodsForEvent(List<MethodReference> handlers,
LifecycleOwner source, Lifecycle.Event event, Object mWrapped) {
if (handlers != null) {
for (int i = handlers.size() - 1; i >= 0; i--) {
handlers.get(i).invokeCallback(source, event, mWrapped);
}
}
}
其实是调用到了MethodReference的invokeCallback方法
void invokeCallback(LifecycleOwner source, Lifecycle.Event event, Object target) {
//noinspection TryWithIdenticalCatches
try {
switch (mCallType) {
case CALL_TYPE_NO_ARG:
mMethod.invoke(target);
break;
case CALL_TYPE_PROVIDER:
mMethod.invoke(target, source);
break;
case CALL_TYPE_PROVIDER_WITH_EVENT:
mMethod.invoke(target, source, event);
break;
}
} catch (InvocationTargetException e) {
throw new RuntimeException("Failed to call observer method", e.getCause());
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
这里会mMethod会通过反射去调用。那这个mMethod是什么呢?我们前面分析到CallbackInfo的createInfo的方法的时候
private CallbackInfo createInfo(Class<?> klass, @Nullable Method[] declaredMethods) {
Class<?> superclass = klass.getSuperclass();
Map<MethodReference, Lifecycle.Event> handlerToEvent = new HashMap<>();
if (superclass != null) {
CallbackInfo superInfo = getInfo(superclass);
if (superInfo != null) {
handlerToEvent.putAll(superInfo.mHandlerToEvent);
}
}
Class<?>[] interfaces = klass.getInterfaces();
for (Class<?> intrfc : interfaces) {
for (Map.Entry<MethodReference, Lifecycle.Event> entry : getInfo(
intrfc).mHandlerToEvent.entrySet()) {
verifyAndPutHandler(handlerToEvent, entry.getKey(), entry.getValue(), klass);
}
}
Method[] methods = declaredMethods != null ? declaredMethods : getDeclaredMethods(klass);
boolean hasLifecycleMethods = false;
for (Method method : methods) {
OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);
if (annotation == null) {
continue;
}
hasLifecycleMethods = true;
Class<?>[] params = method.getParameterTypes();
int callType = CALL_TYPE_NO_ARG;
if (params.length > 0) {
callType = CALL_TYPE_PROVIDER;
if (!params[0].isAssignableFrom(LifecycleOwner.class)) {
throw new IllegalArgumentException(
"invalid parameter type. Must be one and instanceof LifecycleOwner");
}
}
Lifecycle.Event event = annotation.value();
if (params.length > 1) {
callType = CALL_TYPE_PROVIDER_WITH_EVENT;
if (!params[1].isAssignableFrom(Lifecycle.Event.class)) {
throw new IllegalArgumentException(
"invalid parameter type. second arg must be an event");
}
if (event != Lifecycle.Event.ON_ANY) {
throw new IllegalArgumentException(
"Second arg is supported only for ON_ANY value");
}
}
if (params.length > 2) {
throw new IllegalArgumentException("cannot have more than 2 params");
}
MethodReference methodReference = new MethodReference(callType, method);
verifyAndPutHandler(handlerToEvent, methodReference, event, klass);
}
CallbackInfo info = new CallbackInfo(handlerToEvent);
mCallbackMap.put(klass, info);
mHasLifecycleMethods.put(klass, hasLifecycleMethods);
return info;
}
会发现,其实method就是我们传入的observer的对应的注解了OnLifecycleEvent的方法。 总结: 组件Activity/Fragment会在相应的声命周期函数里调用dispatch方法分发事件,并调用LifecycleRegistry的handleLifecycleEvent去处理事件。LifecycleRegistry会根据传入的生命周期事件,去决定是否是向前还是向后的逻辑。 然后经过ObserverWithState->ReflectiveGenericLifecycleObserver -> CallbackInfo -> MethodReference,最终通过反射真正调用到自定义LifecycleObserver添加了注解的方法。这就是整个流程