Lifecycles
生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化
使用
-
新建立一个辅助类继承自
LifecycleObserver
,该类作为观察者,观察所在Activity或Fragment的生命周期,从而在不同时候做不同的事情。(利用的是注释的方式)public class MyChronometer extends Chronometer implements LifecycleObserver { public MyChronometer(Context context, AttributeSet attrs) { super(context, attrs); } @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) private void pauseMeter(){ // stop(); } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) private void resumeMeter(){ // start(); } }
-
在Activity中观察者列表中加入目标组件
getLifecycle().addObserver(binding.meter);
源码结构
Lifecycle是抽象类:内部有两个抽象类(Event和State),三个方法(移除/添加观察者+获得当前状态)
其实现类是LifecycleRegistry
,重写了父类(Lifecycle
)的添加/删除观察者的方法,且其内部直接持有当前状态
LifecycleObserver
:该接口没有任何方法,依赖于注解的方法
LifecycleOwner
:具有 Android 的生命周期,定制组件可以使用这些事件来处理生命周期更改,而无需在 Activity 或 Fragment 中实现任何代码,该接口中仅有一个方法getLifecycle()
LifecycleEventObserver
:可以接收任何生命周期更改并将其分派给接收方。
源码分析
1activity生命周期
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
LifecycleOwner,
ViewModelStoreOwner,
SavedStateRegistryOwner,
OnBackPressedDispatcherOwner {
ComponentActivity
是FragmentActivity
和 AppCompatActivity
的基类。
既已实现LifecycleOwner
,那么该类重写其唯一的方法getLifecycle()
。其中返回了一个LifecycleRegistry
的实例
activity 操作生命周期是通过 ReportFragment
处理的
在 ComponentActivity 的 onCreate 方法中,调用了 ReportFragment
中的静态方法 injectIfNeededIn()
2fragment生命周期处理
在 fragment 内部,每个生命周期节点调用 handleLifecycleEvent
方法
3Lifecycle State 大小比较
在Lifecycle.Event中有一个比较的方法(判断当前状态是否不小于传入的状态)
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
State 的顺序为 DESTROYED -> INITIALIZED -> CREATED -> STARTED -> RESUMED
参考自:【背上Jetpack之Lifecycle】万物基于 Lifecycle 默默无闻大用处
https://juejin.im/post/6844904111108800519