假如 我们有某个Activity 需要用到定位相关的逻辑我们代码大家或许会这样写

internal class MyLocationListener(private val context: Context,private val callback: (Location) -> Unit
) {fun start() {// connect to system location service}fun stop() {// disconnect from system location service}
}class MyActivity : AppCompatActivity() {private lateinit var myLocationListener: MyLocationListeneroverride fun onCreate(...) {myLocationListener = MyLocationListener(this) { location ->// update UI}}public override fun onStart() {super.onStart()myLocationListener.start()// manage other components that need to respond// to the activity lifecycle}public override fun onStop() {super.onStop()myLocationListener.stop()// manage other components that need to respond// to the activity lifecycle}
}

在我们需要 使用定位的activity 中,注册定位的监听,然后在onStart()方法中开启定位监听,在onStop()方法中关闭定位监听。相比一般人都会这么写。此时如果我们假如有许多Activity都可能使用到定位,好一点的,我们会将定位的逻辑抽取到BaseActivity中然后根据子类是否需要 ,按需去开启定位的功能。这样写的确是可以实现我们的功能,但是如果Android的多个model,或者Fragemnt中要使用这一功能,我们是不是在每个需要使用的地方重写这样一套逻辑呢,显然大部分人都不希望这么干。此时我们可以使用我们的LifeCycle.

什么是Lifecycle

Lifecycle是一套专门用来感知Activity或Fragment生命周期变化的组件,当Activity或Fragment的生命周期发生的变化的时候,将会通知到Lifecycle的订阅者。这样我们可以把原本需要写在Activity或Fragment的代码抽出来,减少Activity或者Fragment的代码侵入性,使Activity或Fragment更加精简并且易于维护,也可以减少内存泄漏

Lifecycle的使用

1.继承LifeCycleObserver

class CustomLifecycleObserver:LifecycleObserver {val TAG = CustomLifecycleObserver::class.java.simpleName@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)fun onCreateMethod(){Log.e(TAG,"onCreateMethod run")}@OnLifecycleEvent(Lifecycle.Event.ON_START)fun onStartMethod(){Log.e(TAG,"onStartMethod run")}@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)fun onResumeMethod(){Log.e(TAG,"onResumeMethod run")}@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)fun onPauseMethod(){Log.e(TAG,"onPauseMethod run")}@OnLifecycleEvent(Lifecycle.Event.ON_STOP)fun onStopMethod(){Log.e(TAG,"onStopMethod run")}@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)fun onDestoryMethod(){Log.e(TAG,"onDestoryMethod run")}
}

我们只需要 继承LifeCycleObserver ,然后在我们的Activity中注册一个观察者就行了

class LifeCycleActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_life_cycle)lifecycle.addObserver(CustomLifecycleObserver())}
}

这样我们就可以在自定义的CustomLifecycleObserver中去监听Activity的生命周期变化了。

在CustomLifecycleObserver中,我们可以看到方法上面都有@OnLifecycleEvent注解,注解的参数正好是对应了Activity的各种生命周期。

2. 利用LifecycleOwner来实现(具体 原来后面分析源码可以得知)

class CustomLifeOwnerActivity: Activity(),LifecycleOwner {private lateinit var lifecycleRegistry: LifecycleRegistryoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)lifecycleRegistry = LifecycleRegistry(this)lifecycleRegistry.currentState = Lifecycle.State.CREATEDlifecycleRegistry.addObserver(CustomLifecycleObserver())}override fun onStart() {super.onStart()lifecycleRegistry.currentState = Lifecycle.State.STARTED}override fun onResume() {super.onResume()lifecycleRegistry.currentState = Lifecycle.State.RESUMED}override fun getLifecycle(): Lifecycle {return lifecycleRegistry;}
}

这种实现,我们继承自Activity 而不是AppcompactActivity ,因为AppcompactActivity 已经帮我们实现了 这些生命周期的处理。一般我们使用LifeCycle也不使用这种方式,使用第一种 就OK了

Lifecycle的源码分析

在下面的代码中

class LifeCycleActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_life_cycle)lifecycle.addObserver(CustomLifecycleObserver())}
}

我只要使用lifecycle.addObserver(CustomLifecycleObserver()) 代码注册观察者之后CustomLifecycleObserver就可以监听当前Activity的所有生命周期了,我们跟踪源码看看其到底是怎么实现的。

addObserver ->Lifecycle.addObserver(抽象类的方法) -->LifecycleRegistry.addObserver(具体实现)

@Overridepublic 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);..... //后面省略的代码 可以到之后的LiveData中讲解 具体的意义}

这里其实 就是将自己创建的CustomLifecycleObserver加入到mObserverMap中缓存起来,供后面的生命周期回调。

Activity的生命周期回调 ,怎么使我们的自定义Observer回调呢,这里其实有使用到跟Glide相同方法,就是构建一个Fragment,然后在Fragment中去回调 生命周期,这样的确有点巧妙,我们看具体的代码

// ComponentActivity
protected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);ReportFragment.injectIfNeededIn(this);}// ReportActivity
public static void injectIfNeededIn(Activity activity) {// ProcessLifecycleOwner should always correctly work and some activities may not extend// FragmentActivity from support lib, so we use framework fragments for activitiesandroid.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();}}

使用这些代码之后 就注入了一个不可见的ReportFragment,来感知Activity的生命周期,看ReportFragment的onResume方法

//ReprotFragment
@Overridepublic void onResume() {super.onResume();dispatchResume(mProcessListener);dispatch(Lifecycle.Event.ON_RESUME);}private void dispatch(Lifecycle.Event event) {Activity activity = getActivity();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的话,最后走到了LifecycleRegistry 的handleLifecycleEvent(event)方法

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;// we will figure out what to do on upper level.return;}mHandlingEvent = true;sync();mHandlingEvent = false;}private void sync() {LifecycleOwner lifecycleOwner = mLifecycleOwner.get();if (lifecycleOwner == null) {throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"+ "garbage collected. It is too late to change lifecycle state.");}while (!isSynced()) {mNewEventOccurred = false;// 检测如果你住处Observer的时候activity 状态 与存储的Observer状态对比// Activity 为onResume Observer可能需要执行从onCreate->onResumeif (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;}

最终的逻辑会进入sync方法中,走两个分支的方法,backwardPass或者forwardPass方法,无非 就是 向前或者向后执行 生命周期的相关方法。我们这里看forwardPass方法的距离逻辑

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();}}}

最后都会走到 observer.dispatchEvent(lifecycleOwner, event); 其中的observer 是 ObserverWithState。这个类我们在最开始的时候 lifecycle.addObserver方法中看到

@Overridepublic 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);.....}

最终会走到ObserverWithState方法中的dispatchEvent方法中

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;}}

调用LifecycleEventObserver 的onStateChanged方法。看构造函数中的LifecycleEventObserver是怎么生成的

@NonNullstatic LifecycleEventObserver lifecycleEventObserver(Object object) {boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;if (isLifecycleEventObserver && isFullLifecycleObserver) {return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,(LifecycleEventObserver) object);}if (isFullLifecycleObserver) {return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);}if (isLifecycleEventObserver) {return (LifecycleEventObserver) object;}final Class<?> klass = object.getClass();// 根据我们传入的对象,获得tyep类型,带有@OnLifecycleEvent注解的类型 就返回// REFLECTIVE_CALLBACK 并且根据注解int type = getObserverConstructorType(klass);if (type == GENERATED_CALLBACK) {List<Constructor<? extends GeneratedAdapter>> 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);}//Lifecycling.java   resolveObserverCallbackType 方法
boolean hasLifecycleMethods = ClassesInfoCache.sInstance.hasLifecycleMethods(klass);//ClassesInfoCacheboolean hasLifecycleMethods(Class<?> klass) {Boolean hasLifecycleMethods = mHasLifecycleMethods.get(klass);if (hasLifecycleMethods != null) {return hasLifecycleMethods;}Method[] methods = getDeclaredMethods(klass);for (Method method : methods) {OnLifecycleEvent annotation = method.getAnnotation(OnLifecycleEvent.class);if (annotation != null) {// Optimization for reflection, we know that this method is called// when there is no generated adapter. But there are methods with @OnLifecycleEvent// so we know that will use ReflectiveGenericLifecycleObserver,// so we createInfo in advance.// CreateInfo always initialize mHasLifecycleMethods for a class, so we don't do it// here.createInfo(klass, methods);return true;}}mHasLifecycleMethods.put(klass, false);return false;}

这里 会将有OnLifecycleEvent 注解的方法 通过反射拿出来,最后缓存起来。

然后回到Lifecycleing的方法 因为type返回的是 REFLECTIVE_CALLBACK 所以最终 会返回 ReflectiveGenericLifecycleObserver的对象,然后调用其onStateChanged方法,

class ReflectiveGenericLifecycleObserver implements LifecycleEventObserver {private final Object mWrapped;private final CallbackInfo mInfo;ReflectiveGenericLifecycleObserver(Object wrapped) {mWrapped = wrapped;mInfo = ClassesInfoCache.sInstance.getInfo(mWrapped.getClass());}@Overridepublic void onStateChanged(@NonNull LifecycleOwner source, @NonNull Event event) {mInfo.invokeCallbacks(source, event, mWrapped);}
}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);}}}

最终回去从这里执行到刚刚 通过反射 缓存的生命周期的方法,这样 就从ReportFragment 中生命周期回调到我们自定义的Observer中的回调方法了。

jetpack之LifeCycle相关推荐

  1. 硬核讲解 Jetpack 之 LifeCycle 使用篇

    大家好,我是 LifeCycle ,来自 Jetpack 生态链的最底端 . 我的作用是感知组件 (Activity/Fragment) 生命周期 ,并在合适的生命周期执行你分配给我的任务.我坚持贯彻 ...

  2. Android databingding与jetpack的lifecycle使用与比较

    1.开发环境Android studio 3.4.0,kotlin 2.databinding用法 3.jetpack lifecycles的LiveData 和 ViewModel用法 测试效果如下 ...

  3. Jetpack 之 LifeCycle

    Jetpack 之 LifeCycle 文章目录 Jetpack 之 LifeCycle @[toc] 1. 使用意义 2. LifeCycle诞生的背景 3. LifeCycle可以做什么 4. 使 ...

  4. Android JetPack系列---Lifecycle

    Android JetPack系列-Lifecycle jetpack也出来很长一段时间了,最近比较闲,然后顺便记录一下自己的学习.然后准备打算的是写一个一系列的文章来完成自己对jetpack 的了解 ...

  5. Jetpack:Lifecycle 和 LiveData

    文章目录 Lifecycle Lifecycle 的使用 Lifecycle 的实现原理 Lifecycle 如何使用状态机管理生命周期 LiveData LiveData 的使用 LiveData ...

  6. android Jetpack之Lifecycle的使用

    Lifecycle是Jetpack提供的一个用于监听生命周期的库.我们知道在使用Activity和Fragment的时候,特别是两者一起使用的时候,生命周期将变得非常的复杂.而且我们需要在Activi ...

  7. Android Jetpack之LifeCycle

    目录 Jetpack 1.那么Jetpack是什么呢? 2.为何使用Jetpack? 3. Jetpack与AndroidX LifeCycle 1.LifeCycle的作用​编辑 2. LifeCy ...

  8. 在 Jetpack Compose 中安全地使用数据流

    /   今日科技快讯   / 11月17日下午,暴雪中国官方微博发布公告称,各位暴雪游戏的国服玩家,我们很遗憾地通知大家,随着我们与网之易公司现有授权协议的到期,自2023年1月24日0点起,所有&l ...

  9. Android Jetpack之DataBinding+ViewModel+LiveData+Room

    Android Jetpack之ViewModel.LiveData Android Jetpack之LifeCycle 前言 Jetpack是一个由多个技术库组成的套件,可帮助开发者遵循最佳做法,减 ...

最新文章

  1. 【微服务架构】SpringCloud之Feign
  2. pandas.read_csv()跳过读取文件报错行
  3. android 触摸 卡顿,Android CoordinatorLayout(五) 严重的卡顿BUG
  4. 谷歌火狐浏览器限制的端口
  5. qt 文件 时间 倒序排列_win7电脑敬业签便签软件分类标签里的内容如何按提醒时间排列?...
  6. 牛客多校4 - Count New String(序列自动机+广义后缀自动机)
  7. ElasticSearch 快照 备份、恢复数据
  8. java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
  9. Mysql 中is null 和 =null 的区别
  10. Windows下Node.js安装及环境配置
  11. AOP实践—ASP.NET MVC5 使用Filter过滤Action参数防止sql注入,让你代码安全简洁
  12. 容错性低是什么意思_王者荣耀:在成为高手之前,这4位容错率低的千万别碰!...
  13. 【​观察】机遇和挑战并存 智能手环需要来一次华丽的蜕变
  14. CSS3变形之2D变形
  15. 农村电商是什么 农产品电商平台如何运营?
  16. Charles 配置 https
  17. 服装ERP应用优势有哪些?
  18. 微信、QQ发消息功能测试用例
  19. UTF-16 UTF-8
  20. U-Mail邮件服务器玩转Pushmail

热门文章

  1. 个性化的创新BMW X2
  2. 双11福利!买课即赠书——11个品牌的“增长炼金术”+《私域不完全指南》
  3. linux重新做raid,Linux下做RAID和LVM
  4. 做成功的投资者,拒绝持续亏损,赚的金银钵满
  5. 2007 Microsoft Office system, Windows Vista, Exchange Server 2007 Launch
  6. 从 拼多多 到 抖音
  7. linux 修改时间报错,教你解决linux操作系统时间错误
  8. DB2更改表字段长度
  9. lightroom 闪退_Texstudio打开闪退-解决方法
  10. 一个批量数据导入的实现方案