LifeCycles
使用时候层次:「User的Activity」-》【中间BaseActivity】--> AppCompatActivity--》FragmentActivity --》 ComponentActivity
观察者模式
我们可以加上任意 对象观察Activity声明周期
getLifecycle().addObserver(presenter);
//----> getLifecycle().addObserver(任意一个我们想要加入的观察);
getLifecycle()返回这个类
  LifecycleRegistry ----》
    public LifecycleRegistry(@NonNull LifecycleOwner provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }
addObserver(xxxx) 的运行时实现
          State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
一开始一定是 INITIALIZED 状态
ComponentActivity
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
SavedStateRegistryOwner extends LifecycleOwner 
所以有事后用了这两个类,注意
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mSavedStateRegistryController.performRestore(savedInstanceState);
    ReportFragment.injectIfNeededIn(this);
    if (mContentLayoutId != 0) {
        setContentView(mContentLayoutId);
    }
}
这段代码的意思是,在Activity里面 ReportFragment.injectIfNeededIn(this); 注入,生成一个看不见的fragment在上面
有一个变量全程在记录Ativity 的声明周期状态
ReportFragment -->各种声明周期调用dispatch() 进行各种事件的分发
 -- >handleLifecycleEvent ---> 「String next= getStateAfter」
 ----> moveToState()---> sync()
 「目的是将状态正向推,或者反向推,和Activity的当前状态保持一致」
 ---> backwardPass 或者 forwardPass
 ----> mLifecycleObserver.onStateChanged---->「很多实现CompositeGeneratedAdaptersObserver ,FullLifecycleObserverAdapter ,SingleGeneratedAdapterObserver , ReflectiveGenericLifecycleObserver」
所有实现最终会走到 ReflectiveGenericLifecycleObserver ===》
ReflectiveGenericLifecycleObserver 构造方法,通过反射拿到带有OnLifecycleEvent注解的方法
LiveData
LiveData 不会单独使用,一般会和ViewModel一起用,封装集成ViewModel 提供返回数据的方法返回LiveData<T>
viewModel.getLiveData<T>.observe(xxxx, 实现);
LiveData 的逻辑结构是这个样子的观察者和被观察者
【被观察者】<--------【LiveData--- mVersion】<----------【其他观察者1---mLastVersion】
 <-----------【其他观察者n----mLasteVersion】
observe 方法里面有这样两句话
LifecycleBoundObserver wrapper = new LifecycleBoundObserver(owner, observer);
ObserverWrapper existing = mObservers.putIfAbsent(observer, wrapper);
putIfAbsent----> 从SafeIterableMap 拿观察者,如果有拿着用没有就放进去观察者
LiveData 的设置 setValue 查看他的机构 mVersion,
分发数据
dispatchingValue(null)
默认是null情况去循环迭代拿观察者,进行通知
considerNotify(ObserverWrapper observer)
同步 activity Livecycles 的状态 mLastversion = mVersion 更新 消息
然后回调到哦们的onChange
补充: 查看一下 LiveData 的postValue 方法:他是在子线程的
ArchTaskExecutor.getInstance().postToMainThread(mPostValueRunnable);
用了一个线程池,会帮助你从子线程切换到主线程上去
LiveData 封装 成 bus集合
通常我们项目中不可能到处用LiveData,我们用一个数组总线的方式控制
简单实现,开源有实现
public class LiveDataBus {
    //存放订阅者
    private Map<String, MutableLiveData<Object>> bus;
    private static LiveDataBus liveDataBus = new LiveDataBus();
    private LiveDataBus() {
        bus = new HashMap();
    }
    public static LiveDataBus getInstance() {
        return liveDataBus;
    }
    //注册订阅者
    public synchronized <T> MutableLiveData<T> with(String key, Class<T> type) {
        if(!bus.containsKey(key)){
            bus.put(key,new MutableLiveData<Object>());
        }
        return (MutableLiveData<T>)bus.get(key);
    }
}










