简介
Lifecycle是Google推荐的架构组件之一.
生命周期感知型组件可执行操作来响应另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护。
通过使用生命周期感知型组件,您可以将依赖组件的代码从生命周期方法移入组件本身中。
我们来描述一种业务场景来帮助我们更好的理解上面这段话的意义。
当我们的Activity中使用了自定义的播放器组件时,我们通常需要在Activity的onResume和onPause中做一些播放和暂停播放的操作,并在onDestroy中停止/释放播放器。当我们的Activity中有更多类似的组件时,会使得onResume和onPause等生命周期方法的逻辑过于复杂且不易于维护。这种场景下通过使用Lifecycle组件,可以使原本在Activity中的代码逻辑,集成到播放器等组件内,使得组件的逻辑更加内敛,更易于维护。
使用
Lifecycle通过观察者模式,使得其他的组件可以感知另一个组件(Activity和Fragment等)的生命周期变化。
LifeCycleOwner
直译过来就是生命周期所有者,接口中只定义了一个方法getLifecycle()
返回一个Lifecycle
对象,可以让其他对象有生命周期的对象实现Lifecycle功能。
在Android Support Library 26.1.0 及其之后已经activity 和 fragment 已经默认实现了LifecycleOwner
。
LifecycleObserver
代码如下:
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
//TOOD: ...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
//TODO: ...
}
}
//Activity或Fragment中
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());
这样当该Activity的生命周期发生变化时MyObserver
就可以监听到,做相应的处理。
自定义View:
public class TestLifeCycleView extends TextView {
private static final String TAG = TestLifeCycleView.class.getSimpleName();
private LifecycleObserver lifeCycleObserver;
public TestLifeCycleView(Context context) {
this(context, null);
}
public TestLifeCycleView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public TestLifeCycleView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public LifecycleObserver getLifeCycleObserver(){
if(lifeCycleObserver == null){
lifeCycleObserver = new LifecycleObserver() {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onLifeOnCreate(){
Log.d(TAG, "onLifeOnCreate");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onLifeOnResume(){
Log.d(TAG, "onLifeOnResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onLifePause(){
Log.d(TAG, "onLifePause");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onLifeDestroy(){
Log.d(TAG, "onLifeDestroy");
}
};
}
return lifeCycleObserver;
}
}
//Activity
testLifeCycleView = findViewById(R.id.test_lifecycle_view);
getLifecycle().addObserver(testLifeCycleView.getLifeCycleObserver());
总结
Lifecycle通过使用观察者模式,巧妙的解决了Activity和Fragment生命周期方法过于臃肿难以维护的问题,也使得自定义View的相关逻辑操作内敛到类中,使得代码更加简洁,与Activity的耦合度更低,易于维护。
网友评论