import static androidx.lifecycle.Lifecycle.State.DESTROYED;
import static androidx.lifecycle.Lifecycle.State.INITIALIZED;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import androidx.annotation.MainThread;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.annotation.VisibleForTesting;
import androidx.arch.core.executor.ArchTaskExecutor;
import androidx.arch.core.internal.FastSafeIterableMap;
import androidx.arch.core.internal.SafeIterableMap;
import androidx.lifecycle.ClassesInfoCache;
import androidx.lifecycle.CompositeGeneratedAdaptersObserver;
import androidx.lifecycle.EmptyActivityLifecycleCallbacks;
import androidx.lifecycle.GeneratedAdapter;
import androidx.lifecycle.GenericLifecycleObserver;
import androidx.lifecycle.LifecycleRegistry;
import androidx.lifecycle.ReflectiveGenericLifecycleObserver;
import androidx.lifecycle.ReportFragment;
import androidx.lifecycle.SingleGeneratedAdapterObserver;
import java.lang.ref.WeakReference;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
/**
* 1.LifeCycle几个相关的类
* */
public
/**
* 1.1 LifeCycle 事件定义
* 1.怎么实现自己的类拥有声明周期 实现接口 owner来生成装饰拓展的代码
* 2.规定了cycleEvent 下发的时机 . 一个是在..之前 一种是在..之后
* 3.定义了几个枚举类
* 4.这里从哪个状态到哪个状态不太理解; 因为没有用到地方,暂时先不关注.
* 5.总体理解就是,这个是声明周期类型的定义. 需要配合 lfowner(拥有者,下发) 和 DefaultLifecycleObserver(观察者,接受)
* */
/**
* Defines an object that has an Android Lifecycle. {@link androidx.fragment.app.Fragment Fragment}
* and {@link androidx.fragment.app.FragmentActivity FragmentActivity} classes implement
* {@link LifecycleOwner} interface which has the {@link LifecycleOwner#getLifecycle()
* getLifecycle} method to access the Lifecycle. You can also implement {@link LifecycleOwner}
* in your own classes.
*
* {@link androidx.lifecycle.Lifecycle.Event#ON_CREATE}, {@link androidx.lifecycle.Lifecycle.Event#ON_START}, {@link androidx.lifecycle.Lifecycle.Event#ON_RESUME} events in this class
* are dispatched <b>after</b> the {@link LifecycleOwner}'s related method returns.
* {@link androidx.lifecycle.Lifecycle.Event#ON_PAUSE}, {@link androidx.lifecycle.Lifecycle.Event#ON_STOP}, {@link androidx.lifecycle.Lifecycle.Event#ON_DESTROY} events in this class
* are dispatched <b>before</b> the {@link LifecycleOwner}'s related method is called.
* For instance, {@link androidx.lifecycle.Lifecycle.Event#ON_START} will be dispatched after
* {@link android.app.Activity#onStart onStart} returns, {@link androidx.lifecycle.Lifecycle.Event#ON_STOP} will be dispatched
* before {@link android.app.Activity#onStop onStop} is called.
* This gives you certain guarantees on which state the owner is in.
*
* To observe lifecycle events call {@link #addObserver(LifecycleObserver)} passing an object
* that implements either {@link DefaultLifecycleObserver} or {@link LifecycleEventObserver}.
* */
public abstract class Lifecycle {
/**
* Lifecycle coroutines extensions stashes the CoroutineScope into this field.
*
* @hide used by lifecycle-common-ktx
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP)
@NonNull
AtomicReference mInternalScopeRef =new AtomicReference<>();
/**
* Adds a LifecycleObserver that will be notified when the LifecycleOwner changes
* state.
*
* The given observer will be brought to the current state of the LifecycleOwner.
* For example, if the LifecycleOwner is in {@link androidx.lifecycle.Lifecycle.State#STARTED} state, the given observer
* will receive {@link androidx.lifecycle.Lifecycle.Event#ON_CREATE}, {@link androidx.lifecycle.Lifecycle.Event#ON_START} events.
*
* @param observer The observer to notify.
*/
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
/**
* Removes the given observer from the observers list.
*
* If this method is called while a state change is being dispatched,
*
* <li>If the given observer has not yet received that event, it will not receive it.
* <li>If the given observer has more than 1 method that observes the currently dispatched
* event and at least one of them received the event, all of them will receive the event and
* the removal will happen afterwards.
*
*
* @param observer The observer to be removed.
*/
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
/**
* Returns the current state of the Lifecycle.
*
* @return The current state of the Lifecycle.
*/
@MainThread
@NonNull
public abstract androidx.lifecycle.Lifecycle.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,
/**
* Constant for onResume event of the {@link LifecycleOwner}.
*/
ON_RESUME,
/**
* Constant for onPause event of the {@link LifecycleOwner}.
*/
ON_PAUSE,
/**
* Constant for onStop event of the {@link LifecycleOwner}.
*/
ON_STOP,
/**
* Constant for onDestroy event of the {@link LifecycleOwner}.
*/
ON_DESTROY,
/**
* An {@link androidx.lifecycle.Lifecycle.Event Event} constant that can be used to match all events.
*/
ON_ANY;
/**
*
* Returns the {@link androidx.lifecycle.Lifecycle.Event} that will be reported by a {@link androidx.lifecycle.Lifecycle}
* leaving the specified {@link androidx.lifecycle.Lifecycle.State} to a lower state, or {@code null}
* if there is no valid event that can move down from the given state.
*
* @param state the higher state that the returned event will transition down from
* @return the event moving down the lifecycle phases from state
*/
@Nullable
public static androidx.lifecycle.Lifecycle.Event downFrom(@NonNull androidx.lifecycle.Lifecycle.State state) {
switch (state) {
case CREATED:
return ON_DESTROY;
case STARTED:
return ON_STOP;
case RESUMED:
return ON_PAUSE;
default:
return null;
}
}
/**
* Returns the {@link androidx.lifecycle.Lifecycle.Event} that will be reported by a {@link androidx.lifecycle.Lifecycle}
* entering the specified {@link androidx.lifecycle.Lifecycle.State} from a higher state, or {@code null}
* if there is no valid event that can move down to the given state.
*
* @param state the lower state that the returned event will transition down to
* @return the event moving down the lifecycle phases to state
*/
@Nullable
public static androidx.lifecycle.Lifecycle.Event downTo(@NonNull androidx.lifecycle.Lifecycle.State state) {
switch (state) {
case DESTROYED:
return ON_DESTROY;
case CREATED:
return ON_STOP;
case STARTED:
return ON_PAUSE;
default:
return null;
}
}
/**
* Returns the {@link androidx.lifecycle.Lifecycle.Event} that will be reported by a {@link androidx.lifecycle.Lifecycle}
* leaving the specified {@link androidx.lifecycle.Lifecycle.State} to a higher state, or {@code null}
* if there is no valid event that can move up from the given state.
*
* @param state the lower state that the returned event will transition up from
* @return the event moving up the lifecycle phases from state
*/
@Nullable
public static androidx.lifecycle.Lifecycle.Event upFrom(@NonNull androidx.lifecycle.Lifecycle.State state) {
switch (state) {
case INITIALIZED:
return ON_CREATE;
case CREATED:
return ON_START;
case STARTED:
return ON_RESUME;
default:
return null;
}
}
/**
* Returns the {@link androidx.lifecycle.Lifecycle.Event} that will be reported by a {@link androidx.lifecycle.Lifecycle}
* entering the specified {@link androidx.lifecycle.Lifecycle.State} from a lower state, or {@code null}
* if there is no valid event that can move up to the given state.
*
* @param state the higher state that the returned event will transition up to
* @return the event moving up the lifecycle phases to state
*/
@Nullable
public static androidx.lifecycle.Lifecycle.Event upTo(@NonNull androidx.lifecycle.Lifecycle.State state) {
switch (state) {
case CREATED:
return ON_CREATE;
case STARTED:
return ON_START;
case RESUMED:
return ON_RESUME;
default:
return null;
}
}
/**
* Returns the new {@link androidx.lifecycle.Lifecycle.State} of a {@link androidx.lifecycle.Lifecycle} that just reported
* this {@link androidx.lifecycle.Lifecycle.Event}.
*
* Throws {@link IllegalArgumentException} if called on {@link #ON_ANY}, as it is a special
* value used by {@link OnLifecycleEvent} and not a real lifecycle event.
*
* @return the state that will result from this event
*/
@NonNull
public androidx.lifecycle.Lifecycle.State getTargetState() {
switch (this) {
case ON_CREATE:
case ON_STOP:
return androidx.lifecycle.Lifecycle.State.CREATED;
case ON_START:
case ON_PAUSE:
return androidx.lifecycle.Lifecycle.State.STARTED;
case ON_RESUME:
return androidx.lifecycle.Lifecycle.State.RESUMED;
case ON_DESTROY:
return androidx.lifecycle.Lifecycle.State.DESTROYED;
case ON_ANY:
break;
}
throw new IllegalArgumentException(this +" has no target state");
}
}
/**
* Lifecycle states. You can consider the states as the nodes in a graph and
* {@link androidx.lifecycle.Lifecycle.Event}s as the edges between these nodes.
*/
@SuppressWarnings("WeakerAccess")
public enum State {
/**
* Destroyed state for a LifecycleOwner. After this event, this Lifecycle will not dispatch
* any more events. For instance, for an {@link android.app.Activity}, this state is reached
* <b>right before</b> Activity's {@link android.app.Activity#onDestroy() onDestroy} call.
*/
DESTROYED,
/**
* Initialized state for a LifecycleOwner. For an {@link android.app.Activity}, this is
* the state when it is constructed but has not received
* {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} yet.
*/
INITIALIZED,
/**
* Created state for a LifecycleOwner. For an {@link android.app.Activity}, this state
* is reached in two cases:
*
* <li>after {@link android.app.Activity#onCreate(android.os.Bundle) onCreate} call;
* <li><b>right before</b> {@link android.app.Activity#onStop() onStop} call.
*
*/
CREATED,
/**
* Started state for a LifecycleOwner. For an {@link android.app.Activity}, this state
* is reached in two cases:
*
* <li>after {@link android.app.Activity#onStart() onStart} call;
* <li><b>right before</b> {@link android.app.Activity#onPause() onPause} call.
*
*/
STARTED,
/**
* Resumed state for a LifecycleOwner. For an {@link android.app.Activity}, this state
* is reached after {@link android.app.Activity#onResume() onResume} is called.
*/
RESUMED;
/**
* Compares if this State is greater or equal to the given {@code state}.
*
* @param state State to compare with
* @return true if this State is greater or equal to the given {@code state}
*/
public boolean isAtLeast(@NonNull androidx.lifecycle.Lifecycle.State state) {
return compareTo(state) >=0;
}
}
}
/**
* 1.2 LifeOwner 事件下发者
* */
/**
* A class that has an Android lifecycle. These events can be used by custom components to
* handle lifecycle changes without implementing any code inside the Activity or the Fragment.
*
* @see androidx.lifecycle.Lifecycle
* @see ViewTreeLifecycleOwner
*/
@SuppressWarnings({"WeakerAccess", "unused"})
public interface LifecycleOwner {
/**
* Returns the Lifecycle of the provider.
*
* @return The lifecycle of the provider.
*/
@NonNull
androidx.lifecycle.Lifecycle getLifecycle();
}
/**
* 1.3 LifeCycleObserver 和 LifeCycleEventObserver 两种事件观察者
* lifeCycleObserver 不是直接拿来用的
* eventObserver 或者 DefaultLifecycleObserver 这两个
* */
/**
* Marks a class as a LifecycleObserver. Don't use this interface directly. Instead implement either
* {@link DefaultLifecycleObserver} or {@link LifecycleEventObserver} to be notified about
* lifecycle events.
*
* @see androidx.lifecycle.Lifecycle Lifecycle - for samples and usage patterns.
*/
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {
}
/**
* Class that can receive any lifecycle change and dispatch it to the receiver.
*
* If a class implements both this interface and
* {@link androidx.lifecycle.DefaultLifecycleObserver}, then
* methods of {@code DefaultLifecycleObserver} will be called first, and then followed by the call
* of {@link androidx.lifecycle.LifecycleEventObserver#onStateChanged(androidx.lifecycle.LifecycleOwner, androidx.lifecycle.Lifecycle.Event)}
*
* If a class implements this interface and in the same time uses {@link OnLifecycleEvent}, then
* annotations will be ignored.
*/
public interface LifecycleEventObserverextends androidx.lifecycle.LifecycleObserver {
/**
* Called when a state transition event happens.
*
* @param source The source of the event
* @param event The event
*/
void onStateChanged(@NonNull androidx.lifecycle.LifecycleOwner source, @NonNull androidx.lifecycle.Lifecycle.Event event);
}
/**
* 1.4 FullLifecycleObserver 和 DefalutLifeCycleObserver 两者的关系
* */
/**
* 正常activity几个声明周期的回调.
* */
interface FullLifecycleObserverextends androidx.lifecycle.LifecycleObserver {
void onCreate(androidx.lifecycle.LifecycleOwner owner);
void onStart(androidx.lifecycle.LifecycleOwner owner);
void onResume(androidx.lifecycle.LifecycleOwner owner);
void onPause(androidx.lifecycle.LifecycleOwner owner);
void onStop(androidx.lifecycle.LifecycleOwner owner);
void onDestroy(androidx.lifecycle.LifecycleOwner owner);
}
/**
* DefaultLifeCycleObserver 下面的两点声明 ==>> 注意这里还有一个注解 OnLifecycleEvent todo 这里进行一下验证,官方已经把这个废弃了
* 1. 单实现这个接口 并且同时实现 LifecycleEventObserver event接口, 那么先是onCreate() onStart() 这种接口 然后才是 onStateChange();
* 2. 这个接口 ,和 注解 OnLifecycleEvent 一起使用时, 以接口回调为主. 注解不生效了就.
* */
public interface DefaultLifecycleObserverextends androidx.lifecycle.FullLifecycleObserver {
/**
* Notifies that {@code ON_CREATE} event occurred.
*
* This method will be called after the {@link androidx.lifecycle.LifecycleOwner}'s {@code onCreate}
* method returns.
*
* @param owner the component, whose state was changed
*/
@Override
default void onCreate(@NonNull androidx.lifecycle.LifecycleOwner owner) {
}
/**
* Notifies that {@code ON_START} event occurred.
*
* This method will be called after the {@link androidx.lifecycle.LifecycleOwner}'s {@code onStart} method returns.
*
* @param owner the component, whose state was changed
*/
@Override
default void onStart(@NonNull androidx.lifecycle.LifecycleOwner owner) {
}
/**
* Notifies that {@code ON_RESUME} event occurred.
*
* This method will be called after the {@link androidx.lifecycle.LifecycleOwner}'s {@code onResume}
* method returns.
*
* @param owner the component, whose state was changed
*/
@Override
default void onResume(@NonNull androidx.lifecycle.LifecycleOwner owner) {
}
/**
* Notifies that {@code ON_PAUSE} event occurred.
*
* This method will be called before the {@link androidx.lifecycle.LifecycleOwner}'s {@code onPause} method
* is called.
*
* @param owner the component, whose state was changed
*/
@Override
default void onPause(@NonNull androidx.lifecycle.LifecycleOwner owner) {
}
/**
* Notifies that {@code ON_STOP} event occurred.
*
* This method will be called before the {@link androidx.lifecycle.LifecycleOwner}'s {@code onStop} method
* is called.
*
* @param owner the component, whose state was changed
*/
@Override
default void onStop(@NonNull androidx.lifecycle.LifecycleOwner owner) {
}
/**
* Notifies that {@code ON_DESTROY} event occurred.
*
* This method will be called before the {@link androidx.lifecycle.LifecycleOwner}'s {@code onDestroy} method
* is called.
*
* @param owner the component, whose state was changed
*/
@Override
default void onDestroy(@NonNull androidx.lifecycle.LifecycleOwner owner) {
}
}
/**
* FullLifecycleObserverAdapter ==>> states 发生变化时通知 ==>> fullLifeCycleObserver 这个是oncreate onstart onresume 这几种状态变化的监听
* 1. 和上面的解释 defaultLifecycleObserver 对应 这里一会儿看activity中是怎么通知的.
* */
class FullLifecycleObserverAdapterimplements androidx.lifecycle.LifecycleEventObserver {
private final androidx.lifecycle.FullLifecycleObserver mFullLifecycleObserver;
private final androidx.lifecycle.LifecycleEventObserver mLifecycleEventObserver;
FullLifecycleObserverAdapter(androidx.lifecycle.FullLifecycleObserver fullLifecycleObserver,
androidx.lifecycle.LifecycleEventObserver lifecycleEventObserver) {
mFullLifecycleObserver = fullLifecycleObserver;
mLifecycleEventObserver = lifecycleEventObserver;
}
@Override
public void onStateChanged(@NonNull androidx.lifecycle.LifecycleOwner source, @NonNull androidx.lifecycle.Lifecycle.Event event) {
switch (event) {
case ON_CREATE:
mFullLifecycleObserver.onCreate(source);
break;
case ON_START:
mFullLifecycleObserver.onStart(source);
break;
case ON_RESUME:
mFullLifecycleObserver.onResume(source);
break;
case ON_PAUSE:
mFullLifecycleObserver.onPause(source);
break;
case ON_STOP:
mFullLifecycleObserver.onStop(source);
break;
case ON_DESTROY:
mFullLifecycleObserver.onDestroy(source);
break;
case ON_ANY:
throw new IllegalArgumentException("ON_ANY must not been send by anybody");
}
if (mLifecycleEventObserver !=null) {
mLifecycleEventObserver.onStateChanged(source, event);
}
}
}
/**
* 分析一下系统中 Application.ActivityLifecycleCallback 的使用
* 针对几种acticity生命周期提供了 **前 **中 **后的回调
*
* */
public interface ActivityLifecycleCallbacks {
/**
* Called as the first step of the Activity being created. This is always called before
* {@link Activity#onCreate}.
*/
default void onActivityPreCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
}
/**
* Called when the Activity calls {@link Activity#onCreate super.onCreate()}.
*/
void onActivityCreated(@NonNull Activity activity, @Nullable Bundle savedInstanceState);
/**
* Called as the last step of the Activity being created. This is always called after
* {@link Activity#onCreate}.
*/
default void onActivityPostCreated(@NonNull Activity activity,
@Nullable Bundle savedInstanceState) {
}
/**
* Called as the first step of the Activity being started. This is always called before
* {@link Activity#onStart}.
*/
default void onActivityPreStarted(@NonNull Activity activity) {
}
/**
* Called when the Activity calls {@link Activity#onStart super.onStart()}.
*/
void onActivityStarted(@NonNull Activity activity);
/**
* Called as the last step of the Activity being started. This is always called after
* {@link Activity#onStart}.
*/
default void onActivityPostStarted(@NonNull Activity activity) {
}
/**
* Called as the first step of the Activity being resumed. This is always called before
* {@link Activity#onResume}.
*/
default void onActivityPreResumed(@NonNull Activity activity) {
}
/**
* Called when the Activity calls {@link Activity#onResume super.onResume()}.
*/
void onActivityResumed(@NonNull Activity activity);
/**
* Called as the last step of the Activity being resumed. This is always called after
* {@link Activity#onResume} and {@link Activity#onPostResume}.
*/
default void onActivityPostResumed(@NonNull Activity activity) {
}
/**
* Called as the first step of the Activity being paused. This is always called before
* {@link Activity#onPause}.
*/
default void onActivityPrePaused(@NonNull Activity activity) {
}
/**
* Called when the Activity calls {@link Activity#onPause super.onPause()}.
*/
void onActivityPaused(@NonNull Activity activity);
/**
* Called as the last step of the Activity being paused. This is always called after
* {@link Activity#onPause}.
*/
default void onActivityPostPaused(@NonNull Activity activity) {
}
/**
* Called as the first step of the Activity being stopped. This is always called before
* {@link Activity#onStop}.
*/
default void onActivityPreStopped(@NonNull Activity activity) {
}
/**
* Called when the Activity calls {@link Activity#onStop super.onStop()}.
*/
void onActivityStopped(@NonNull Activity activity);
/**
* Called as the last step of the Activity being stopped. This is always called after
* {@link Activity#onStop}.
*/
default void onActivityPostStopped(@NonNull Activity activity) {
}
/**
* Called as the first step of the Activity saving its instance state. This is always
* called before {@link Activity#onSaveInstanceState}.
*/
default void onActivityPreSaveInstanceState(@NonNull Activity activity,
@NonNull Bundle outState) {
}
/**
* Called when the Activity calls
* {@link Activity#onSaveInstanceState super.onSaveInstanceState()}.
*/
void onActivitySaveInstanceState(@NonNull Activity activity, @NonNull Bundle outState);
/**
* Called as the last step of the Activity saving its instance state. This is always
* called after{@link Activity#onSaveInstanceState}.
*/
default void onActivityPostSaveInstanceState(@NonNull Activity activity,
@NonNull Bundle outState) {
}
/**
* Called as the first step of the Activity being destroyed. This is always called before
* {@link Activity#onDestroy}.
*/
default void onActivityPreDestroyed(@NonNull Activity activity) {
}
/**
* Called when the Activity calls {@link Activity#onDestroy super.onDestroy()}.
*/
void onActivityDestroyed(@NonNull Activity activity);
/**
* Called as the last step of the Activity being destroyed. This is always called after
* {@link Activity#onDestroy}.
*/
default void onActivityPostDestroyed(@NonNull Activity activity) {
}
/**
* Called when the Activity configuration was changed.
* @hide
*/
default void onActivityConfigurationChanged(@NonNull Activity activity) {
}
}
/**
* Activity 中的注册方法 他和application中的方法调用时序问题 ==>> 验证成功,这里嵌套流程确实如此...
* */
/**
* Register an {@link Application.ActivityLifecycleCallbacks} instance that receives
* lifecycle callbacks for only this Activity. /// 仅仅对这个activity 注册一个声明周期观察者实例
*
* In relation to any //// 这里 涉及到了Application 的registerActivityLifecycleCallbacks方法... 介绍两者之间的关系
* {@link Application#registerActivityLifecycleCallbacks Application registered callbacks},
* the callbacks registered here will always occur nested within those callbacks.
*
* 这里注册的监听会嵌套在application中注册的监听之中
*
* This means:
*
*
*
* // 先给application,然后再给到这里
* <li>Pre events will first be sent to Application registered callbacks, then to callbacks
* registered here.
*
* // 三个事件application先收到. 其他的事件,这里先收到
* <li>{@link Application.ActivityLifecycleCallbacks#onActivityCreated(Activity, Bundle)},
* {@link Application.ActivityLifecycleCallbacks#onActivityStarted(Activity)}, and
* {@link Application.ActivityLifecycleCallbacks#onActivityResumed(Activity)} will
* be sent first to Application registered callbacks, then to callbacks registered here.
* For all other events, callbacks registered here will be sent first.
*
* // 还有一种 PostEv ents 这个是啥??? todo 等待验证
* <li>Post events will first be sent to callbacks registered here, then to
* Application registered callbacks.
*
*
* If multiple callbacks are registered here, they receive events in a first in (up through
* {@link Application.ActivityLifecycleCallbacks#onActivityPostResumed}, last out
* ordering.
*
* It is strongly recommended to register this in the constructor of your Activity to ensure
* you get all available callbacks. As this callback is associated with only this Activity,
* it is not usually necessary to {@link #unregisterActivityLifecycleCallbacks unregister} it
* unless you specifically do not want to receive further lifecycle callbacks.
*
* @param callback The callback instance to register
*/
public void registerActivityLifecycleCallbacks(
@NonNull Application.ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.add(callback);
}
}
/**
* Application 中的注册方法
* */
public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.add(callback);
}
}
/**
* Lifecycling observer的类型转换判断
* 这里配合 singleGFeneratedAdapterObserver 暂时不关注这个
* */
/**
* Internal class to handle lifecycle conversion etc.
*
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class Lifecycling {
private static final int REFLECTIVE_CALLBACK =1;
private static final int GENERATED_CALLBACK =2;
private static Map, Integer> sCallbackCache =new HashMap<>();
private static Map, List>> sClassToAdapters =
new HashMap<>();
// Left for binary compatibility when lifecycle-common goes up 2.1 as transitive dep
// but lifecycle-runtime stays 2.0
/**
* @deprecated Left for compatibility with lifecycle-runtime:2.0
*/
@SuppressWarnings("deprecation")
@Deprecated
@androidx.annotation.NonNull
static GenericLifecycleObserver getCallback(final Object object) {
final androidx.lifecycle.LifecycleEventObserver observer = lifecycleEventObserver(object);
return new GenericLifecycleObserver() {
@Override
public void onStateChanged(@androidx.annotation.NonNull androidx.lifecycle.LifecycleOwner source,
@androidx.annotation.NonNull androidx.lifecycle.Lifecycle.Event event) {
observer.onStateChanged(source, event);
}
};
}
@androidx.annotation.NonNull
@SuppressWarnings("deprecation")
static androidx.lifecycle.LifecycleEventObserver lifecycleEventObserver(Object object) {
boolean isLifecycleEventObserver = objectinstanceof androidx.lifecycle.LifecycleEventObserver;
boolean isFullLifecycleObserver = objectinstanceof androidx.lifecycle.FullLifecycleObserver;
if (isLifecycleEventObserver && isFullLifecycleObserver) {
return new androidx.lifecycle.FullLifecycleObserverAdapter((androidx.lifecycle.FullLifecycleObserver) object,
(androidx.lifecycle.LifecycleEventObserver) object);
}
if (isFullLifecycleObserver) {
return new androidx.lifecycle.FullLifecycleObserverAdapter((androidx.lifecycle.FullLifecycleObserver) object, null);
}
if (isLifecycleEventObserver) {
return (androidx.lifecycle.LifecycleEventObserver) object;
}
final Class klass = object.getClass();
int type = getObserverConstructorType(klass);
if (type == GENERATED_CALLBACK) {
List> constructors =
sClassToAdapters.get(klass);
if (constructors.size() ==1) {
GeneratedAdapter generatedAdapter = createGeneratedAdapter(
constructors.get(0), object);
return new SingleGeneratedAdapterObserver(generatedAdapter);
}
GeneratedAdapter[] adapters =new GeneratedAdapter[constructors.size()];
for (int i =0; i < constructors.size(); i++) {
adapters[i] = createGeneratedAdapter(constructors.get(i), object);
}
return new CompositeGeneratedAdaptersObserver(adapters);
}
return new ReflectiveGenericLifecycleObserver(object);
}
private static GeneratedAdapter createGeneratedAdapter(
Constructor constructor, Object object) {
//noinspection TryWithIdenticalCatches
try {
return constructor.newInstance(object);
}catch (IllegalAccessException e) {
throw new RuntimeException(e);
}catch (InstantiationException e) {
throw new RuntimeException(e);
}catch (InvocationTargetException e) {
throw new RuntimeException(e);
}
}
@SuppressWarnings("deprecation")
@androidx.annotation.Nullable
private static Constructor generatedConstructor(Class klass) {
try {
Package aPackage = klass.getPackage();
String name = klass.getCanonicalName();
final String fullPackage = aPackage !=null ? aPackage.getName() :"";
final String adapterName = getAdapterName(fullPackage.isEmpty() ? name :
name.substring(fullPackage.length() +1));
@SuppressWarnings("unchecked")final Class aClass =
(Class) Class.forName(
fullPackage.isEmpty() ? adapterName : fullPackage +"." + adapterName);
Constructor constructor =
aClass.getDeclaredConstructor(klass);
if (!constructor.isAccessible()) {
constructor.setAccessible(true);
}
return constructor;
}catch (ClassNotFoundException e) {
return null;
}catch (NoSuchMethodException e) {
// this should not happen
throw new RuntimeException(e);
}
}
private static int getObserverConstructorType(Class klass) {
Integer callbackCache = sCallbackCache.get(klass);
if (callbackCache !=null) {
return callbackCache;
}
int type = resolveObserverCallbackType(klass);
sCallbackCache.put(klass, type);
return type;
}
private static int resolveObserverCallbackType(Class klass) {
// anonymous class bug:35073837
if (klass.getCanonicalName() ==null) {
return REFLECTIVE_CALLBACK;
}
Constructor constructor = generatedConstructor(klass);
if (constructor !=null) {
sClassToAdapters.put(klass, Collections
.>singletonList(constructor));
return GENERATED_CALLBACK;
}
@SuppressWarnings("deprecation")
boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);
if (hasLifecycleMethods) {
return REFLECTIVE_CALLBACK;
}
Class superclass = klass.getSuperclass();
List> adapterConstructors =null;
if (isLifecycleParent(superclass)) {
if (getObserverConstructorType(superclass) == REFLECTIVE_CALLBACK) {
return REFLECTIVE_CALLBACK;
}
adapterConstructors =new ArrayList<>(sClassToAdapters.get(superclass));
}
for (Class intrface : klass.getInterfaces()) {
if (!isLifecycleParent(intrface)) {
continue;
}
if (getObserverConstructorType(intrface) == REFLECTIVE_CALLBACK) {
return REFLECTIVE_CALLBACK;
}
if (adapterConstructors ==null) {
adapterConstructors =new ArrayList<>();
}
adapterConstructors.addAll(sClassToAdapters.get(intrface));
}
if (adapterConstructors !=null) {
sClassToAdapters.put(klass, adapterConstructors);
return GENERATED_CALLBACK;
}
return REFLECTIVE_CALLBACK;
}
private static boolean isLifecycleParent(Class klass) {
return klass !=null && androidx.lifecycle.LifecycleObserver.class.isAssignableFrom(klass);
}
/**
* Create a name for an adapter class.
*/
public static String getAdapterName(String className) {
return className.replace(".", "_") +"_LifecycleAdapter";
}
private Lifecycling() {
}
}
/**
* LifecycleDispatcher ==>> 这个需要借助文章来对比一下这个用法. todo ==>> 等待验证
* // 这个是为了 child-fragments设计的.
* a.hook了application的 callback
* b.当一个activity不能再执行一个fragment 的事务的时候,停止掉所有的provider
* */
/**
* When initialized, it hooks into the Activity callback of the Application and observes
* Activities. It is responsible to hook in child-fragments to activities and fragments to report
* their lifecycle events. Another responsibility of this class is to mark as stopped all lifecycle
* providers related to an activity as soon it is not safe to run a fragment transaction in this
* activity.
*/
class LifecycleDispatcher {
private static AtomicBoolean sInitialized =new AtomicBoolean(false);
static void init(Context context) {
if (sInitialized.getAndSet(true)) {
return;
}
((Application) context.getApplicationContext())
.registerActivityLifecycleCallbacks(new androidx.lifecycle.LifecycleDispatcher.DispatcherActivityCallback());
}
@SuppressWarnings("WeakerAccess")
@VisibleForTesting
static class DispatcherActivityCallbackextends EmptyActivityLifecycleCallbacks {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
ReportFragment.injectIfNeededIn(activity);
}
@Override
public void onActivityStopped(Activity activity) {
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
}
private LifecycleDispatcher() {
}
}
/**
* ProcessLifecycleOwner todo:// 等待验证 和 application.activitylifecycleCallback 之间的关系
* 应用进程相关 ===>>> 前后台
* */
/**
* Class that provides lifecycle for the whole application process.
*
* You can consider this LifecycleOwner as the composite of all of your Activities, except that
* {@link androidx.lifecycle.Lifecycle.Event#ON_CREATE} will be dispatched once and {@link androidx.lifecycle.Lifecycle.Event#ON_DESTROY}
* will never be dispatched. Other lifecycle events will be dispatched with following rules:
*
* // 第一个activity下发 onstart ,onresume 时,触发. 并且只下发一次.
* ProcessLifecycleOwner will dispatch {@link androidx.lifecycle.Lifecycle.Event#ON_START},
* {@link androidx.lifecycle.Lifecycle.Event#ON_RESUME} events, as a first activity moves through these events.
*
*
* // 最后一个activity 下发完以后,延迟一会再触发.
* {@link androidx.lifecycle.Lifecycle.Event#ON_PAUSE}, {@link androidx.lifecycle.Lifecycle.Event#ON_STOP}, events will be dispatched with
* a <b>delay</b> after a last activity
* passed through them.
*
* // 考虑到了 configuration
* This delay is long enough to guarantee that ProcessLifecycleOwner
* won't send any events if activities are destroyed and recreated due to a
* configuration change.
*
*
*
* // 前后台判断 ==>> 有毫秒级别的误差.
* It is useful for use cases where you would like to react on your app coming to the foreground or
* going to the background and you don't need a milliseconds accuracy in receiving lifecycle
* events.
*/
@SuppressWarnings("WeakerAccess")
public class ProcessLifecycleOwnerimplements androidx.lifecycle.LifecycleOwner {
@VisibleForTesting
static final long TIMEOUT_MS =700; //mls
// ground truth counters
private int mStartedCounter =0;
private int mResumedCounter =0;
private boolean mPauseSent =true;
private boolean mStopSent =true;
private Handler mHandler;
private final LifecycleRegistry mRegistry =new LifecycleRegistry(this);
private Runnable mDelayedPauseRunnable =new Runnable() {
@Override
public void run() {
dispatchPauseIfNeeded();
dispatchStopIfNeeded();
}
};
ReportFragment.ActivityInitializationListener mInitializationListener =
new ReportFragment.ActivityInitializationListener() {
@Override
public void onCreate() {
}
@Override
public void onStart() {
activityStarted();
}
@Override
public void onResume() {
activityResumed();
}
};
private static final androidx.lifecycle.ProcessLifecycleOwner sInstance =new androidx.lifecycle.ProcessLifecycleOwner();
/**
* The LifecycleOwner for the whole application process. Note that if your application
* has multiple processes, this provider does not know about other processes.
*
* @return {@link androidx.lifecycle.LifecycleOwner} for the whole application.
*/
@androidx.annotation.NonNull
public static androidx.lifecycle.LifecycleOwner get() {
return sInstance;
}
static void init(Context context) {
sInstance.attach(context);
}
void activityStarted() {
mStartedCounter++;
if (mStartedCounter ==1 && mStopSent) {
mRegistry.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_START);
mStopSent =false;
}
}
void activityResumed() {
mResumedCounter++;
if (mResumedCounter ==1) {
if (mPauseSent) {
mRegistry.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_RESUME);
mPauseSent =false;
}else {
mHandler.removeCallbacks(mDelayedPauseRunnable);
}
}
}
void activityPaused() {
mResumedCounter--;
if (mResumedCounter ==0) {
mHandler.postDelayed(mDelayedPauseRunnable, TIMEOUT_MS);
}
}
void activityStopped() {
mStartedCounter--;
dispatchStopIfNeeded();
}
void dispatchPauseIfNeeded() {
if (mResumedCounter ==0) {
mPauseSent =true;
mRegistry.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_PAUSE);
}
}
void dispatchStopIfNeeded() {
if (mStartedCounter ==0 && mPauseSent) {
mRegistry.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_STOP);
mStopSent =true;
}
}
private ProcessLifecycleOwner() {
}
@SuppressWarnings("deprecation")
void attach(Context context) {
mHandler =new Handler();
mRegistry.handleLifecycleEvent(androidx.lifecycle.Lifecycle.Event.ON_CREATE);
Application app = (Application) context.getApplicationContext();
app.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
@RequiresApi(29)
@Override
public void onActivityPreCreated(@androidx.annotation.NonNull Activity activity,
@androidx.annotation.Nullable Bundle savedInstanceState) {
// We need the ProcessLifecycleOwner to get ON_START and ON_RESUME precisely
// before the first activity gets its LifecycleOwner started/resumed.
// The activity's LifecycleOwner gets started/resumed via an activity registered
// callback added in onCreate(). By adding our own activity registered callback in
// onActivityPreCreated(), we get our callbacks first while still having the
// right relative order compared to the Activity's onStart()/onResume() callbacks.
activity.registerActivityLifecycleCallbacks(new EmptyActivityLifecycleCallbacks() {
@Override
public void onActivityPostStarted(@androidx.annotation.NonNull Activity activity) {
activityStarted();
}
@Override
public void onActivityPostResumed(@androidx.annotation.NonNull Activity activity) {
activityResumed();
}
});
}
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
// Only use ReportFragment pre API 29 - after that, we can use the
// onActivityPostStarted and onActivityPostResumed callbacks registered in
// onActivityPreCreated()
if (Build.VERSION.SDK_INT <29) {
ReportFragment.get(activity).setProcessListener(mInitializationListener);
}
}
@Override
public void onActivityPaused(Activity activity) {
activityPaused();
}
@Override
public void onActivityStopped(Activity activity) {
activityStopped();
}
});
}
@androidx.annotation.NonNull
@Override
public androidx.lifecycle.Lifecycle getLifecycle() {
return mRegistry;
}
}
/**
* LifecycleRegistry lifecycle 注册表和调度器 todo 目前接触到了 processlifeCycle activity application 就剩下 fragment了 todo:// 这里工具类===>> 还有一个fragment
* */
/**
* An implementation of {@link androidx.lifecycle.Lifecycle} that can handle multiple observers.
*
* It is used by Fragments and Support Library Activities. You can also directly use it if you have
* a custom LifecycleOwner.
*/
public class LifecycleRegistryextends androidx.lifecycle.Lifecycle {
/**
* // removals/additions during traversal.
* Custom list that keeps observers and can handle removals / additions during traversal.
*
* // 后进先调?
* Invariant: at any moment of time for observer1 & observer2:
* if addition_order(observer1) < addition_order(observer2), then
* state(observer1) >= state(observer2),
*/
private FastSafeIterableMap mObserverMap =
new FastSafeIterableMap<>();
/**
* Current state
*/
private State mState;
/**
* The provider that owns this Lifecycle.
* Only WeakReference on LifecycleOwner is kept, so if somebody leaks Lifecycle, they won't leak
* the whole Fragment / Activity. However, to leak Lifecycle object isn't great idea neither,
* because it keeps strong references on all other listeners, so you'll leak all of them as
* well.
*/
private final WeakReference mLifecycleOwner;
private int mAddingObserverCounter =0;//???
private boolean mHandlingEvent =false;
private boolean mNewEventOccurred =false; //有没有新的event?
//
// we have to keep it for cases:
// void onStart() {
// mRegistry.removeObserver(this);
// mRegistry.add(newObserver);
// }
// newObserver should be brought only to CREATED state during the execution of
// this onStart method. our invariant with mObserverMap doesn't help, because parent observer
// is no longer in the map.
private ArrayList mParentStates =new ArrayList<>();
private final boolean mEnforceMainThread;
/**
* Creates a new LifecycleRegistry for the given provider.
*
* // 创建的时候注意点
* You should usually create this inside your LifecycleOwner class's constructor and hold
* onto the same instance.
*
* @param provider The owner LifecycleOwner
*/
public LifecycleRegistry(@androidx.annotation.NonNull androidx.lifecycle.LifecycleOwner provider) {
this(provider, true);
}
private LifecycleRegistry(@androidx.annotation.NonNull androidx.lifecycle.LifecycleOwner provider, boolean enforceMainThread) {
mLifecycleOwner =new WeakReference<>(provider);
mState = INITIALIZED; // 初始化状态,
mEnforceMainThread = enforceMainThread;
}
/**
* Moves the Lifecycle to the given state and dispatches necessary events to the observers.
*
* @param state new state
* @deprecated Use {@link #setCurrentState(State)}.
*/
@Deprecated
@MainThread
public void markState(@androidx.annotation.NonNull State state) {
enforceMainThreadIfNeeded("markState");
setCurrentState(state);
}
/**
* Moves the Lifecycle to the given state and dispatches necessary events to the observers.
*
* @param state new state
*/
@MainThread
public void setCurrentState(@androidx.annotation.NonNull State state) {
enforceMainThreadIfNeeded("setCurrentState");
moveToState(state);
}
/**
* Sets the current state and notifies the observers.
*
* Note that if the {@code currentState} is the same state as the last call to this method,
* calling this method has no effect.
*
* @param event The event that was received
*/
public void handleLifecycleEvent(@androidx.annotation.NonNull androidx.lifecycle.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;
// we will figure out what to do on upper level.
return;
}
mHandlingEvent =true;
sync(); //
mHandlingEvent =false;
}
/**
* 当前lifecycleOwner 状态是否下发完毕.......
* */
private boolean isSynced() {
// 没有观察者的时候,
if (mObserverMap.size() ==0) {
return true;
}
// 最早添加的observer
State eldestObserverState = mObserverMap.eldest().getValue().mState;
State newestObserverState = mObserverMap.newest().getValue().mState;
// 后来添加的observer
return eldestObserverState == newestObserverState && mState == newestObserverState;
}
private State calculateTargetState(androidx.lifecycle.LifecycleObserver observer) {
// 本次key键值对中之前添加的, 还是链表中之前的那个?????
Map.Entry 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);
}
@Override
public void addObserver(@androidx.annotation.NonNull androidx.lifecycle.LifecycleObserver observer) {
enforceMainThreadIfNeeded("addObserver");
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
// 新增加的时候,不是 initialized 就是destroyed
androidx.lifecycle.LifecycleRegistry.ObserverWithState statefulObserver =new androidx.lifecycle.LifecycleRegistry.ObserverWithState(observer, initialState);
androidx.lifecycle.LifecycleRegistry.ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
// 已经添加过 不再继续
if (previous !=null) {
return;
}
// 销毁了,不再继续使用
androidx.lifecycle.LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner ==null) {
// it is null we should be destroyed. Fallback quickly
return;
}
// 增加观察者的时候,是否是正在重入的状态
boolean isReentrance = mAddingObserverCounter !=0 || mHandlingEvent;
// 取到 上次添加的状态;正在通知的状态;以及当前状态 最小的一个 ==>> 为了都下发出去
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
// 这里还真他娘的不好懂.... 存在 一个调整顺序的东西吧暂时理解为
while ((statefulObserver.mState.compareTo(targetState) <0
&& mObserverMap.contains(observer))) {
// parent中添加
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();
// mState / subling may have been changed recalculate
// 再重新计算
targetState = calculateTargetState(observer);
}
//
if (!isReentrance) {
// we do sync only on the top level.
sync();
}
mAddingObserverCounter--;
}
// 尾巴去..
private void popParentState() {
mParentStates.remove(mParentStates.size() -1);
}
// 尾巴加..
private void pushParentState(State state) {
mParentStates.add(state);
}
/**
* 草他妈,这里有点儿难
* */
@Override
public void removeObserver(@androidx.annotation.NonNull androidx.lifecycle.LifecycleObserver observer) {
enforceMainThreadIfNeeded("removeObserver");
// we consciously decided not to send destruction events here in opposition to addObserver.
// Our reasons for that:
// 1. These events haven't yet happened at all. In contrast to events in addObservers, that
// actually occurred but earlier.
// 2. There are cases when removeObserver happens as a consequence of some kind of fatal
// event. If removeObserver method sends destruction events, then a clean up routine becomes
// more cumbersome. More specific example of that is: your LifecycleObserver listens for
// a web connection, in the usual routine in OnStop method you report to a server that a
// session has just ended and you close the connection. Now let's assume now that you
// lost an internet and as a result you removed this observer. If you get destruction
// events in removeObserver, you should have a special case in your onStop method that
// checks if your web connection died and you shouldn't try to report anything to a server.
mObserverMap.remove(observer);
}
/**
* The number of observers.
*
* @return The number of observers.
*/
@SuppressWarnings("WeakerAccess")
public int getObserverCount() {
enforceMainThreadIfNeeded("getObserverCount");
return mObserverMap.size();
}
@androidx.annotation.NonNull
@Override
public State getCurrentState() {
return mState;
}
//向前传递
private void forwardPass(androidx.lifecycle.LifecycleOwner lifecycleOwner) {
Iterator> ascendingIterator =
mObserverMap.iteratorWithAdditions();
while (ascendingIterator.hasNext() && !mNewEventOccurred) {
Map.Entry entry = ascendingIterator.next();
//当前遍历的值
//这里不好理解...
androidx.lifecycle.LifecycleRegistry.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(androidx.lifecycle.LifecycleOwner lifecycleOwner) {
Iterator> descendingIterator =
mObserverMap.descendingIterator();
// 最新的observer来进行通知
while (descendingIterator.hasNext() && !mNewEventOccurred) {
Map.Entry entry = descendingIterator.next();
androidx.lifecycle.LifecycleRegistry.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();
}
}
}
// happens only on the top of stack (never in reentrance),
// so it doesn't have to take in account parents
//
private void sync() {
//
androidx.lifecycle.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.");
}
//如果有observer没有完成同步
while (!isSynced()) {
mNewEventOccurred =false;
// no need to check eldest for nullability, because isSynced does it for us.
// 当前的状态如果比最初的状态还要小
// 之前observer里面状态还没有同步过来, 就是还没下发 ==>> 需要进行下发
if (mState.compareTo(mObserverMap.eldest().getValue().mState) <0) {
backwardPass(lifecycleOwner);
}
Map.Entry newest = mObserverMap.newest();
if (!mNewEventOccurred && newest !=null
&& mState.compareTo(newest.getValue().mState) >0) {
forwardPass(lifecycleOwner);
}
}
mNewEventOccurred =false;
}
@SuppressLint("RestrictedApi")
private void enforceMainThreadIfNeeded(String methodName) {
if (mEnforceMainThread) {
if (!ArchTaskExecutor.getInstance().isMainThread()) {
throw new IllegalStateException("Method " + methodName +" must be called on the "
+"main thread");
}
}
}
/**
* Creates a new LifecycleRegistry for the given provider, that doesn't check
* that its methods are called on the threads other than main.
*
*
* // 这里是说非同步,外部方法要保持同步
* LifecycleRegistry is not synchronized: if multiple threads access this {@code
* LifecycleRegistry}, it must be synchronized externally.
*
* Another possible use-case for this method is JVM testing, when main thread is not present.
*/
@VisibleForTesting
@androidx.annotation.NonNull
public static androidx.lifecycle.LifecycleRegistry createUnsafe(@androidx.annotation.NonNull androidx.lifecycle.LifecycleOwner owner) {
return new androidx.lifecycle.LifecycleRegistry(owner, false);
}
static State min(@androidx.annotation.NonNull State state1, @androidx.annotation.Nullable State state2) {
return state2 !=null && state2.compareTo(state1) <0 ? state2 : state1;
}
/**
* 有之前状态的一个observer
* */
static class ObserverWithState {
State mState;
androidx.lifecycle.LifecycleEventObserver mLifecycleObserver;
ObserverWithState(androidx.lifecycle.LifecycleObserver observer, State initialState) {
mLifecycleObserver = androidx.lifecycle.Lifecycling.lifecycleEventObserver(observer);
mState = initialState;
}
void dispatchEvent(androidx.lifecycle.LifecycleOwner owner, Event event) {
// 当前代表的状态
State newState = event.getTargetState();
// 最小的状态
mState = min(mState, newState);
// 分发
mLifecycleObserver.onStateChanged(owner, event);
// 更替state状态
mState = newState;
}
}
}
/// 这里有一个原则 : 后添加的观察者的状态必须不大于之前添加的观察者的状态。
/**
* LinkedList 来进行数据的保存.
* */
public class SafeIterableMapimplements Iterable> {
@SuppressWarnings("WeakerAccess")/* synthetic access */
androidx.arch.core.internal.SafeIterableMap.Entry mStart; //最早添加的
private androidx.arch.core.internal.SafeIterableMap.Entry mEnd; //最近添加的
// using WeakHashMap over List, so we don't have to manually remove
// WeakReferences that have null in them.
private WeakHashMap, Boolean> mIterators =new WeakHashMap<>();
private int mSize =0;
// 从最早添加的一个对象向后遍历,然后找到相同的key就添加.
protected androidx.arch.core.internal.SafeIterableMap.Entry get(K k) {
androidx.arch.core.internal.SafeIterableMap.Entry currentNode = mStart;
while (currentNode !=null) {
if (currentNode.mKey.equals(k)) {
break;
}
currentNode = currentNode.mNext;
}
return currentNode;
}
/**
* If the specified key is not already associated
* with a value, associates it with the given value.
*
* @param key key with which the specified value is to be associated
* @param v value to be associated with the specified key
* @return the previous value associated with the specified key,
* or {@code null} if there was no mapping for the key
*/
public V putIfAbsent(@androidx.annotation.NonNull K key, @androidx.annotation.NonNull V v) {
androidx.arch.core.internal.SafeIterableMap.Entry entry = get(key);
if (entry !=null) {
return entry.mValue;
}
put(key, v);
return null;
}
/**
* LinkedList 来进行数据的保存.
* */
protected androidx.arch.core.internal.SafeIterableMap.Entry put(@androidx.annotation.NonNull K key, @androidx.annotation.NonNull V v) {
androidx.arch.core.internal.SafeIterableMap.Entry newEntry =new androidx.arch.core.internal.SafeIterableMap.Entry<>(key, v);
mSize++;
// 最近没有添加.进行更新
if (mEnd ==null) {
mStart = newEntry;
mEnd = mStart;
return newEntry;
}
/**
* 1.几个节点的前后指代都更新过来
* */
mEnd.mNext = newEntry;
newEntry.mPrevious = mEnd;
mEnd = newEntry;
return newEntry;
}
/**
* Removes the mapping for a key from this map if it is present.
*
* @param key key whose mapping is to be removed from the map
* @return the previous value associated with the specified key,
* or {@code null} if there was no mapping for the key
*/
public V remove(@androidx.annotation.NonNull K key) {
// 索性,map里面的entry也看一下呗;
androidx.arch.core.internal.SafeIterableMap.Entry toRemove = get(key);
if (toRemove ==null) {
return null;
}
mSize--;
// 这里链表部分不太明白
if (!mIterators.isEmpty()) {
for (androidx.arch.core.internal.SafeIterableMap.SupportRemove iter : mIterators.keySet()) {
iter.supportRemove(toRemove);
}
}
// 这里就是对双向链表移除一个节点的算法... 简单
if (toRemove.mPrevious !=null) {
toRemove.mPrevious.mNext = toRemove.mNext;
}else {
mStart = toRemove.mNext;
}
if (toRemove.mNext !=null) {
toRemove.mNext.mPrevious = toRemove.mPrevious;
}else {
mEnd = toRemove.mPrevious;
}
toRemove.mNext =null;
toRemove.mPrevious =null;
return toRemove.mValue;
}
/**
* @return the number of elements in this map
*/
public int size() {
return mSize;
}
/**
* @return an ascending iterator, which doesn't include new elements added during an
* iteration.
*/
@androidx.annotation.NonNull
@Override
public Iterator> iterator() {
androidx.arch.core.internal.SafeIterableMap.ListIterator iterator =new androidx.arch.core.internal.SafeIterableMap.AscendingIterator<>(mStart, mEnd);
mIterators.put(iterator, false);
return iterator;
}
/**
* @return an descending iterator, which doesn't include new elements added during an
* iteration.
*/
public Iterator> descendingIterator() {
androidx.arch.core.internal.SafeIterableMap.DescendingIterator iterator =new androidx.arch.core.internal.SafeIterableMap.DescendingIterator<>(mEnd, mStart);
mIterators.put(iterator, false);
return iterator;
}
/**
* return an iterator with additions.
*/
public androidx.arch.core.internal.SafeIterableMap.IteratorWithAdditions iteratorWithAdditions() {
@SuppressWarnings("unchecked")
androidx.arch.core.internal.SafeIterableMap.IteratorWithAdditions iterator =new androidx.arch.core.internal.SafeIterableMap.IteratorWithAdditions();
mIterators.put(iterator, false);
return iterator;
}
/**
* @return eldest added entry or null
*/
public Map.Entry eldest() {
return mStart;
}
/**
* @return newest added entry or null
*/
public Map.Entry newest() {
return mEnd;
}
@Override
public boolean equals(Object obj) {
if (obj ==this) {
return true;
}
if (!(objinstanceof androidx.arch.core.internal.SafeIterableMap)) {
return false;
}
androidx.arch.core.internal.SafeIterableMap map = (androidx.arch.core.internal.SafeIterableMap) obj;
if (this.size() != map.size()) {
return false;
}
Iterator> iterator1 = iterator();
Iterator iterator2 = map.iterator();
while (iterator1.hasNext() && iterator2.hasNext()) {
Map.Entry next1 = iterator1.next();
Object next2 = iterator2.next();
if ((next1 ==null && next2 !=null)
|| (next1 !=null && !next1.equals(next2))) {
return false;
}
}
return !iterator1.hasNext() && !iterator2.hasNext();
}
@Override
public int hashCode() {
int h =0;
Iterator> i = iterator();
while (i.hasNext()) {
h += i.next().hashCode();
}
return h;
}
@Override
public String toString() {
StringBuilder builder =new StringBuilder();
builder.append("[");
Iterator> iterator = iterator();
while (iterator.hasNext()) {
builder.append(iterator.next().toString());
if (iterator.hasNext()) {
builder.append(", ");
}
}
builder.append("]");
return builder.toString();
}
private abstract static class ListIteratorimplements Iterator>,
androidx.arch.core.internal.SafeIterableMap.SupportRemove {
androidx.arch.core.internal.SafeIterableMap.Entry mExpectedEnd;
androidx.arch.core.internal.SafeIterableMap.Entry mNext;
ListIterator(androidx.arch.core.internal.SafeIterableMap.Entry start, androidx.arch.core.internal.SafeIterableMap.Entry expectedEnd) {
this.mExpectedEnd = expectedEnd;
this.mNext = start;
}
@Override
public boolean hasNext() {
return mNext !=null;
}
@SuppressWarnings("ReferenceEquality")
@Override
public void supportRemove(@androidx.annotation.NonNull androidx.arch.core.internal.SafeIterableMap.Entry entry) {
if (mExpectedEnd == entry && entry == mNext) {
mNext =null;
mExpectedEnd =null;
}
if (mExpectedEnd == entry) {
mExpectedEnd = backward(mExpectedEnd);
}
if (mNext == entry) {
mNext = nextNode();
}
}
@SuppressWarnings("ReferenceEquality")
private androidx.arch.core.internal.SafeIterableMap.Entry nextNode() {
if (mNext == mExpectedEnd || mExpectedEnd ==null) {
return null;
}
return forward(mNext);
}
@Override
public Map.Entry next() {
Map.Entry result = mNext;
mNext = nextNode();
return result;
}
abstract androidx.arch.core.internal.SafeIterableMap.Entry forward(androidx.arch.core.internal.SafeIterableMap.Entry entry);
abstract androidx.arch.core.internal.SafeIterableMap.Entry backward(androidx.arch.core.internal.SafeIterableMap.Entry entry);
}
static class AscendingIteratorextends androidx.arch.core.internal.SafeIterableMap.ListIterator {
AscendingIterator(androidx.arch.core.internal.SafeIterableMap.Entry start, androidx.arch.core.internal.SafeIterableMap.Entry expectedEnd) {
super(start, expectedEnd);
}
@Override
androidx.arch.core.internal.SafeIterableMap.Entry forward(androidx.arch.core.internal.SafeIterableMap.Entry entry) {
return entry.mNext;
}
@Override
androidx.arch.core.internal.SafeIterableMap.Entry backward(androidx.arch.core.internal.SafeIterableMap.Entry entry) {
return entry.mPrevious;
}
}
private static class DescendingIteratorextends androidx.arch.core.internal.SafeIterableMap.ListIterator {
DescendingIterator(androidx.arch.core.internal.SafeIterableMap.Entry start, androidx.arch.core.internal.SafeIterableMap.Entry expectedEnd) {
super(start, expectedEnd);
}
@Override
androidx.arch.core.internal.SafeIterableMap.Entry forward(androidx.arch.core.internal.SafeIterableMap.Entry entry) {
return entry.mPrevious;
}
@Override
androidx.arch.core.internal.SafeIterableMap.Entry backward(androidx.arch.core.internal.SafeIterableMap.Entry entry) {
return entry.mNext;
}
}
private class IteratorWithAdditionsimplements Iterator>, androidx.arch.core.internal.SafeIterableMap.SupportRemove {
private androidx.arch.core.internal.SafeIterableMap.Entry mCurrent;
private boolean mBeforeStart =true;
IteratorWithAdditions() {
}
@SuppressWarnings("ReferenceEquality")
@Override
public void supportRemove(@androidx.annotation.NonNull androidx.arch.core.internal.SafeIterableMap.Entry entry) {
if (entry == mCurrent) {
mCurrent = mCurrent.mPrevious;
mBeforeStart = mCurrent ==null;
}
}
@Override
public boolean hasNext() {
if (mBeforeStart) {
return mStart !=null;
}
return mCurrent !=null && mCurrent.mNext !=null;
}
@Override
public Map.Entry next() {
if (mBeforeStart) {
mBeforeStart =false;
mCurrent = mStart;
}else {
mCurrent = mCurrent !=null ? mCurrent.mNext :null;
}
return mCurrent;
}
}
interface SupportRemove {
void supportRemove(@androidx.annotation.NonNull androidx.arch.core.internal.SafeIterableMap.Entry entry);
}
// 这里维护了 双向链表的一个节点;
// 上面的使用就是 mStart mEnd 头部 和尾部LinkedHasMap ==>>
static class Entryimplements Map.Entry {
@androidx.annotation.NonNull
final K mKey;
@androidx.annotation.NonNull
final V mValue;
androidx.arch.core.internal.SafeIterableMap.Entry mNext;
androidx.arch.core.internal.SafeIterableMap.Entry mPrevious;
Entry(@androidx.annotation.NonNull K key, @androidx.annotation.NonNull V value) {
mKey = key;
this.mValue = value;
}
@androidx.annotation.NonNull
@Override
public K getKey() {
return mKey;
}
@androidx.annotation.NonNull
@Override
public V getValue() {
return mValue;
}
@Override
public V setValue(V value) {
throw new UnsupportedOperationException("An entry modification is not supported");
}
@Override
public String toString() {
return mKey +"=" + mValue;
}
@SuppressWarnings("ReferenceEquality")
@Override
public boolean equals(Object obj) {
if (obj ==this) {
return true;
}
if (!(objinstanceof androidx.arch.core.internal.SafeIterableMap.Entry)) {
return false;
}
androidx.arch.core.internal.SafeIterableMap.Entry entry = (androidx.arch.core.internal.SafeIterableMap.Entry) obj;
return mKey.equals(entry.mKey) && mValue.equals(entry.mValue);
}
@Override
public int hashCode() {
return mKey.hashCode() ^ mValue.hashCode();
}
}
}
/**
* FastSafeIterableMap 基于linkedList的结构,又增加了一个hasmap的数据结构.
* */
/**
* Poor's man LinkedHashMap, which supports modifications during iterations.
* Takes more memory that {@link androidx.arch.core.internal.SafeIterableMap}
* It is NOT thread safe.
*
* @param Key type
* @param Value type
* @hide
*/
@RestrictTo(RestrictTo.Scope.LIBRARY_GROUP_PREFIX)
public class FastSafeIterableMapextends androidx.arch.core.internal.SafeIterableMap {
private HashMap> mHashMap =new HashMap<>();
@Override
protected Entry get(K k) {
return mHashMap.get(k);
}
@Override
public V putIfAbsent(@androidx.annotation.NonNull K key, @androidx.annotation.NonNull V v) {
Entry current = get(key);
if (current !=null) {
return current.mValue;
}
mHashMap.put(key, put(key, v));
return null;
}
@Override
public V remove(@androidx.annotation.NonNull K key) {
V removed =super.remove(key);
mHashMap.remove(key);
return removed;
}
/**
* Returns {@code true} if this map contains a mapping for the specified
* key.
*/
public boolean contains(K key) {
return mHashMap.containsKey(key);
}
/**
* Return an entry added to prior to an entry associated with the given key.
*
* @param k the key
*/
public Map.Entry ceil(K k) {
if (contains(k)) {
return mHashMap.get(k).mPrevious;
}
return null;
}
}