记录JetPack组件用法及原理
目录
Lifcycle
使用方法:
LifecycleOwner
Lifecycle
LifecycleObserver
事件分发
解耦优势
面试官:你了解jetPack组件吗?比如Lifecycle
现在距离下班还有两个半小时;估计无法梳理记录完整,没记录完,明天继续~ 就是这么努力
JetPack 是一套Andorid组件库,帮助开发者更容易,快速开发高质量应用。它包括架构组件、UI组件、行为组件等;
- Lifcycle :生命周期管理
- Livedata: 响应式数据持有
- ViewModel:数据与UI分离
- Room:数据库访问
- Navigation: 页面导航
- paging:分页加载
- WorkManger:后台任务管理
- DataBinding :控件绑定
- CameraX:相机
- Constrainlayout:约束布局
Lifcycle
使用方法:
1、添加依赖
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.7.0"
implementation "androidx.lifecycle:lifecycle-extensions:2.2.0" // 有些功能
2、让类感知生命周期
方式一:实现LifecycleObserver (推荐 DefaultLifecycleObserver)
class MyObserver : DefaultLifecycleObserver {override fun onStart(owner: LifecycleOwner) {// 组件开始时的操作}override fun onStop(owner: LifecycleOwner) {// 组件停止时的操作}
}// 其完整实现 @Overridepublic void onCreate(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onCreate(owner);}@Overridepublic void onStart(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onStart(owner);}@Overridepublic void onPause(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onPause(owner);}@Overridepublic void onResume(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onResume(owner);}@Overridepublic void onStop(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onStop(owner);}@Overridepublic void onDestroy(@NonNull LifecycleOwner owner) {DefaultLifecycleObserver.super.onDestroy(owner);}
注册观察者:
// 在 Activity/Fragment 中
lifecycle.addObserver(MyObserver())
方式二:直接获取生命周期状态
if (lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)) {// Do something
}
二:原理
LifecycleOwner
- 所有支持 Jetpack Lifecycle 的组件(如 Activity、Fragment)都实现了
LifecycleOwner
接口,拥有一个Lifecycle
实例。
Lifecycle
Lifecycle
用于管理生命周期状态(如 CREATED、STARTED、RESUMED、DESTROYED)。- 内部有状态机,随着组件经历生命周期方法(如 onStart/onStop),状态会变更,并通知所有注册的观察者。
LifecycleObserver
- 你写的观察者(Observer)实现接口(如 DefaultLifecycleObserver),通过
@OnLifecycleEvent
或方法重载响应生命周期变化。
事件分发
- 当 Activity/Fragment 生命周期发生变化时,框架会自动调用
LifecycleRegistry
的事件分发方法,将事件传递给所有 Observer。
解耦优势
- 这样可以让一些通用逻辑(如定位、传感器、网络监听等)独立成模块,自动感知生命周期,无需在 Activity/Fragment 里写重复的 onStart/onStop。
行了、我承认上述都是我粘贴拷贝的;源码我也去温习了一遍,说实在Lifecycle给我的感觉更像是一个消息总站的设计。
class LifecycleRegistry extends Lifecycle {private State mState;private Map<LifecycleObserver, ObserverWithState> mObserverMap;@Overridepublic void addObserver(LifecycleObserver observer) {// 封装 observerObserverWithState statefulObserver = new ObserverWithState(observer, mState);mObserverMap.put(observer, statefulObserver);// 立即分发当前状态sync();}void handleLifecycleEvent(Event event) {mState = getStateAfter(event); // 状态迁移sync(); // 分发给所有 observer}private void sync() {for (ObserverWithState observer : mObserverMap.values()) {observer.dispatchEvent(mState); // 分发事件}}
}
这些算是关键性源码了,看明白了吗? mObserverMap保存每个注册的observer,当然状态发生变化的时候,sync 经过一些列的查重倒序 分发给注册的Observer;dispatchEvent对应的就是回调的具体状态。
面试官:你了解jetPack组件吗?比如Lifecycle
嗯,有一点了解(谦虚永远都不会错) 比如Lifecycle 是Jetpack架构组件基础能力,它用于感知和管理Fragment、Activity的生命周期,让我们可以更优雅的做资源管理和解耦。
Fragment 和Activity都实现了LifecycleOwner,内部持有一个Lifecycle对象 也就是LifecycleRegistry。而 这个对象就是做状态管理和事件分发的。它维护了当前生命周期 比如 oncreat、started ,每当组件生命周期被调用的时候,都会同步通知LifecycleRegisty状态变更。
到这里其实就是一个观察者模式的应用了,我们通过addObserver注册,LifecycleRegisty会保存在ObserverMap中,会状态变化的时候自动回调Observer对应的方法。
当然LifecycleRegistry因为是弱引用持有LIfecycleOwner,所以当界面不存在的时候,不需要我们去操心泄漏回收问题。