Android 官方架构组件之 Lifecycle

Lifecycle 是官方提供的架构组件之一,目前已是稳定版;与它一块儿提供出来的组件还有ViewModel、LiveData、Roomhtml

Lifecycle 有什么用

在平常开发中,咱们常常须要封装一些自定义的View或者组件,咱们有时后须要它们的生命周期随Activity或Fragment的生命周期发生变化,例如:咱们实现了一个循环播放的轮播广告图组件Banner,在使用该组件时,咱们但愿Activity在onPause时,轮播也中止(这个需求多是产品提出的,也多是出于性能考虑),咱们之前的实现方式以下:android

class MyActivity extends AppCompatActivity {
    private Banner mBanner;

    public void onCreate(...) {
        ...
        mBanner = new Banner();
    }

    @Override
    public void onStart() {
        super.onStart();
        mBanner.onStart();    }

    @Override
    public void onPause() {
        super.onPause();
        mBanner.onPause();
    }
}

复制代码

这里咱们要在Activity的生命周期方法里调用一些Banner的方法,当业务逻辑很复杂时,咱们还会有一些其余组件,好比说定位等,这时Activity等生命周期方法里就会调用更多的方法,这不利于咱们维护。LifeCycle的出现为咱们提供了一种简单的维护方式。bash

Lifecycle 怎么用

引入依赖包

  • Lifecycle已是稳定版,它包含在support library 26.1.0及以后的依赖包中,若是咱们的项目基于这些依赖包,那么不须要额外的引用。
  • support library在26.1.0以前,须要咱们引入另外的包。lifecycle是ViewModel和LiveData的基础构件,因此一下google提供的几个library,都包含Lifecycle
// ViewModel and LiveData
implementation "android.arch.lifecycle:extensions:1.1.0"
// alternatively, just ViewModel
implementation "android.arch.lifecycle:viewmodel:1.1.0"
// alternatively, just LiveData
implementation "android.arch.lifecycle:livedata:1.1.0"

annotationProcessor "android.arch.lifecycle:compiler:1.1.0"

复制代码

使用

  1. 若是咱们Activity不是继承自support library在26.1.0和以后包中的AppCompatActivity,责须要咱们的Activity实现LifecycleOwner接口,已经继承能够忽略
public class MainActivity extends Activity implements LifecycleOwner{
    private LifecycleRegistry mLifecycleRegistry;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        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;
    }
}

复制代码
  1. 将咱们的组件实现LifecycleObserver接口,并注册
public class MainActivity extends AppCompatActivity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        Banner banner = new Banner();
        getLifecycle().addObserver(banner);

    }

   
}

class Banner implements LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void test(){
        Log.e("banner","start");
    }
}
复制代码

附录

  • 咱们能够监听Activity(Fragment)生命周期的事件(Event)或者获得当前的状态(State),监听事件上面已经演示过了( @OnLifecycleEvent(Lifecycle.Event.ON_START)),如下是获取当前状态:
if (lifecycle.getCurrentState().isAtLeast(STARTED)) {
            // connect if not connected
        }
复制代码
  • 全部的事件和状态如图:

参考资料

官方文档

相关文章
相关标签/搜索