LifeCycle简介及使用场景
JetPack架构组件之一,谷歌爸爸官方出品,方便开发者管理Activity或者Fragment的生命周期,所谓管理,其实就是我们需要在生命周期方法里做写很多重复的业务逻辑,譬如一个项目有100个Activity+200个fragment,现在有个需求是要在他们的生命周期方法onResume或者onPause里埋个点做个记录,这时我们以前的做法大多是在BaseActivity或者BaseFragment里操作不就完事了吗?但是我要让你在其中50个Activity和30个Fragment里卖点,那是不是在Base里写不是很科学,等于代码侵入了。所以为了应对此类操作之一的骚业务操作,谷歌出品了LifeCycle。
LifeCycle使用
这里Demo很简单,业务逻辑是记录下100个Activity的onResume和onPause时的状态。(这里写出一个MainActivity的代码)
涉及的类:LogUtil.class、MainActivity.class
- LogUtil.class
public class LogUtil implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void insertLogWithResume() {
Log.i("jetPack", "onResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void insertLogWithPause() {
Log.i("jetPack", "onPause");
}
}
- MainActivity.class
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new LogUtil());
}
}
- 结果
- 说明:
- 创建LogUtil类实现LifecycleObserver接口。
- Demo里实现了两个方法insertLogWithResume()和insertLogWithPause()方法,分别注册@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)和 @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE),从名字不难看出,这就是代表着对应的生命周期方法。
- Lifecycle.Event.目前包括以下几种:
- 最后只要在Activity的onCreate方法用getLifecycle().addObserver()进行关联即可。
LifeCycle原理
采用观察者模式
- 点击MainActivity中的getLifecycle()进到FragmentActivity.class
@Override
public Lifecycle getLifecycle() {
return super.getLifecycle();
}
- 点击super.getLifecycle()进到ComponentActivity
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
发现最终返回的是mLifecycleRegistry。
private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
所以关键类是LifecycleRegistry
- LifecycleRegistry类的关键handleLifecycleEvent
/**
* Sets the current state and notifies the observers.
* <p>
* 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(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
- 最后发现会在Fragment和ReportFragment里的生命周期方法进行dispatch
Fragment.class
void performResume() {
/···省略代码···/
mLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
if (mView != null) {
mViewLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
}
}