LifeCycle
2019-03-28 本文已影响0人
麻油里
LifeCycle是GoogleApp架构中推荐的一个组件
作用
简单的说就是用来监听Activity与Fragment的生命周期变化。
- 在生命周期拥有者与生命周期的观察者之间快速方便的建立一种联系。在生命周期拥有者的生命周期变化时,观察者会收到对应的通知。
- 可以方便的判断当前生命周期拥有者所处在的生命周期状态。
场景
- 在使用mvp写页面时,p中需要感知Activity或Fragment的生命周期,以进行对应的处理。在这种情况下,Activity或Fragment会在各个生命周期的回调中调用p对应的方法,这是比较麻烦的。
- 自定义View需要对页面生命周期变化进行对应的处理,如动画的开始和结束,页面销毁时释放资源等。这种情况下,同样需要在Activity或Fragment的生命周期回调中调用View的各个方法。
- 在使用mvp时,p在收到某个通知时需要判断当前页面的生命周期状态,在这种情况下,需要维护一个记录当前生命状态的变量,也是比较麻烦的。
LifeCycle的两个角色
- LifeCycleOwner 生命周期拥有者,即Activity与Fragment(也可自定义,但局限性大)
- LifeCycleObserver 生命周期观察者,可以是任何类,常见的有mvp的p,自定义View等
如何使用
LifeCycleOwner
AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,所以可以直接使用。LifeCyclerOwner接口很简单,如下:
public interface LifecycleOwner {
Lifecycle getLifecycle();
}
LifeCycleObserver
生命周期观察者需要实现LifeCycleObserver接口,这个接口没有任何方法。那他如何对生命周期进行观察呢?答案是依赖注解-->OnLifecycleEvent
/**
* Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
* {@link OnLifecycleEvent} annotated methods.
* <p>
* @see Lifecycle Lifecycle - for samples and usage patterns.
*/
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {
}
这个修饰方法的注解定义了一个Lifecycle.Event类型的值
@SuppressWarnings("unused")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface OnLifecycleEvent {
Lifecycle.Event value();
}
最终LifeCycleObserver的实现类如下
public class MyLifeCycleObserver implements LifecycleObserver{
private static final String TAG="MyLifeCycleObserver";
public MyLifeCycleObserver() {
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onActivityResume(){
Log.d(TAG,"onActivityResume");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onActivityPause(){
Log.d(TAG,"onActivityPause");
}
}
这里LifeCycleObserver对LifeCycleOwner的ON_RESUME和ON_PAUSE方法进行了观察,在LifeCycleOwner的生命周期产生变化的时候会调用LifeCycleObserver中注解修饰的方法。
两个角色定义好后,需要让他们之间建立联系
很简单,一行代码即可。上面说过了AppCompatActivity已经实现了LifeCycleOwner接口。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getLifecycle().addObserver(new MyLifeCycleObserver());
}
}
运行过后,在Activity OnResume和OnPause的时候,就会Log出对应的信息。
判断当前处在的生命周期
Lifecycle允许其他的对象判断当前的生命周期状态。方法如下
if (lifecycle.getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
// do something After Started
}
这个方法不是用来判断是否处于某个状态,而且用来判断是否到达了某个状态。
自定义LifecycleOwner
上面说了,AppCompatActivity与V4中的Fragment都已默认实现了LifeCyclerOwner接口,基本上可以应对所有的情况了,并且,自定义LifecycleOwner方法也比较简单,就直接贴代码了。
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
}
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@NonNull
@Override
public Lifecycle getLifecycle() {
return mLifecycleRegistry;
}
}
其实就是两步走,先注册,然后在各个生命周期内做标记。
总结
LifeCycle组件实际上并没有带来什么新的功能,他通过观察者模式+注解来让我们更方便的监听Activity和Fragment的生命周期变化。