Lifecycle 讲解


Lifecycle使用详解

Lifecycle可以做什么

Lifecycle 是具有生命周期感知能力的组件,也就是说,在Activity或者Fragment的生命周期发生变动的是否得到通知。我们往往会在Activity的各种生命周期方法里执行特定的方法。

public class TestActivity extends AppCompatActivity {

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

    @Override
    protected void onStart() {
        super.onStart();
        EventBus.getDefault().register(this);
    }

    @Override
    protected void onDestroy() {
        EventBus.getDefault().unregister(this);
        super.onDestroy();
    }
}

如果我们把很多这种需要跟生命周期相关的逻辑代码直接放在Activity的生命周期方法中,Activity会变的很难以维护的。通过使用Lifecycle,来避免这种情况。

Lifecycle使用

导入Lifecycle依赖

AndroidX:

implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"

Lifecycler 实现机制

  1. 需要一个构建Lifecycle对象(通过一个实现了LifecycleOwner接口的对象 getLifecycle() 方法返回),这个对象就是一个被观察者,具有生命感知能力。
  2. 构建一个LifecycleObserver对象,对指定的Lifecycle对象进行监听(观察者
  3. 通过将Lifecyc对象的addObserver()方法,将Lifecycle对象和LifecycleObserver对象进行绑定。

继承AppCompatActivity

创建 MyObserver.java 让它实现LifeyclerObserver 接口(LifecycleObserver接口是一个空接口,主要给注解处理器使用):

/**
 *   by:Thecara home
 *   date:2020/10/11
 */
class MyObserver : LifecycleObserver {
    // 使用注解 @OnLifecycleEvent() 该方法需要监听指定的生命周期事件
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun connectListener() {
        Log.d("MyObserver", "ON_RESUME")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun disconnectListener() {
        Log.d("MyObserver", "ON_PAUSE")
    }
}

可以看到,通过在方法上使用 @onLifecycleEvent 注解使得方法具有生命感知能力。括号里的参数,表明需要监听的是什么生命周期事件。Lifecycle 主要通过Event和State者两个枚举类来追踪关联组件的生命周期状态。具体的Event和State之间的转换关系,可以参考如下:

让Activity继承自AppCompatActivity,然后再OnCreate()方法中通过 getLifecycle().addObserver(new MyObserver()) 完成LifecycleLifecycleObser的绑定:

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        // 绑定
        lifecycle.addObserver(MyObserver())
    }
}

通过切换后台观察状态。

切换

Log

library 26.1.0 及之后的库中,AppCompatActivity的父类SupportActivity已经默认实现了LifecycleOwner接口,直接通过getLifecycle() 方法获得Lifecycle对象。

之后通过 addObserver() 方法将Lifecycle 跟指定 LifecycleObserver 进行绑定。

Docs

androidx.lifecycle

ViewModelProvider 类

An utility class that provides ViewModels for a scope.

Default ViewModelProvider for an Activity or a Fragment can be obtained by passing it to the constructor: ViewModelProvider(myFragment)

为作用域提供ViewModels的实用程序类。

构造方法

ViewModelProvider

  • Creates ViewModelProvider.

    创建ViewModelProvider。

  • This will create ViewModels and retain them in a store of the given ViewModelStoreOwner.

    这将创建ViewModels,并将它们保留在给定的ViewModelStoreOwner的存储中。

public final ViewModelProvider(@NonNull ViewModelStoreOwner owner)

get 方法

  • Returns an existing ViewModel or creates a new one in the scope (usually, a fragment or an activity), associated with this ViewModelProvider.

    返回一个现有的ViewModel,或者在范围(通常是片段或活动)中创建一个与这个ViewModelProvider相关联的新ViewModel。

  • The created ViewModel is associated with the given scope and will be retained as long as the scope is alive (e.g. if it is an activity, until it is finished or process is killed).

    创建的ViewModel与给定的作用域相关联,只要作用域还活着,ViewModel就会被保留(例如,如果它是一个活动,直到它完成或进程被终止)。

@MainThread
public @NonNull T <T extends ViewModel> get(@NonNull Class<@NonNull T> modelClass)

参数

modelClass:The class of the ViewModel to create an instance of it if it is not present.

ViewModel的类,如果它不存在,可以创建它的实例。

返回值

A ViewModel that is an instance of the given type T.

一个ViewModel,它是给定类型T的一个实例。

报错

java.lang.IllegalArgumentException:

if the given modelClass is local or anonymous class.

如果给定的modelClass是本地或匿名类。

LiveData 类

LiveData is a data holder class that can be observed within a given lifecycle.

LiveData是一个数据持有者类,可以在给定的生命周期中观察它。

This means that an Observer can be added in a pair with a LifecycleOwner, and this observer will be notified about modifications of the wrapped data only if the paired LifecycleOwner is in active state.

这意味着观察者可以和LifecycleOwner一起添加,只有当配对的LifecycleOwner处于活动状态时,观察者才会收到包装数据修改的通知。

LifecycleOwner is considered as active, if its state is STARTED or RESUMED.

LifecycleOwner被认为是活动的,如果它的状态是STARTED或RESUMED。

An observer added via observeForever is considered as always active and thus will be always notified about modifications.

通过observeForever添加的观察者会被认为始终处于活动状态,因此会一直收到修改通知。

For those observers, you should manually call removeObserver.

对于这些观察者,您应该手动调用removeObserver。

observe

Adds the given observer to the observers list within the lifespan of the given owner.

在给定所有者的生命周期内将给定的观察者添加到观察者列表中。

The events are dispatched on the main thread.

事件在主线程上分派。

If LiveData already has data set, it will be delivered to the observer.

如果LiveData已经拥有数据集,那么它将被交付给观察者。

@MainThread

public void observe(@NonNull LifecycleOwner owner, @NonNull Observer<Object> observer)

引用:

Android生命周期组件Lifecycle使用详解


文章作者: TheCara
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 TheCara !
 上一篇
Kotlin 协程 Kotlin 协程
什么是协程 用同步的方式写异步的代码 【协程 Coroutines】 源于Simula 和 Modula-2语言,术语来自于 1958 年的 Melvin Edward Conway 发明并且拥有构建汇编程序,说明 协程是一种编程思想,
2020-10-14
下一篇 
什么是BuildConfig 什么是BuildConfig
什么是 BuildConfig在打包时自动生成的类。类似于R.class,生成后不能修改。
2020-09-17
  目录