LifeCycle

作者: 麻油里 | 来源:发表于2019-03-28 11:49 被阅读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的生命周期变化。

相关文章

网友评论

    本文标题:LifeCycle

    本文链接:https://www.haomeiwen.com/subject/yyqqbqtx.html