Google推荐架构之LifeCycle组件

LifeCycle是Google最新App架构中推荐的一个组件

作用

简单的说就是用来监听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的生命周期变化。

转载于:https://juejin.im/post/5a97c610518825558251c213

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值