Jetpack组件——LifeCycle

LifeCycle 简介

在许多情况下我们需要感知页面的声明周期变化,例如 MVVM 架构中有时候 ViewModel 层需要感知 View 层的生命周期,以往的方式是在 View 层的各个生命周期回调函数中调用 ViewModel 中定义的各个方法。因此,Google 推出了 LifeCycle 组件,用于 Activity 等组件的生命周期,例如在上述情景下,ViewModel 层可以通过 LifeCycle 组件感知到 View 层的声明周期变化,从而主动做出响应。

LifeCycle 介绍

LifeCycle 通过观察者模式实现对页面生命周期的监听,它有以下两个接口:

LifeCycleOwner(被监听者)

实现 LifeCycleOwner 接口的是生命周期的拥有者,可以是 Activity、Fragment、Service 和 Application。LifeCycleOwner 接口的源码如下所示:

public interface LifecycleOwner {
    
    
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

从源码可以看到 LifeCycleOwner 中只有一个 getLifecycle() 方法,用于获取 LifeCycleRegistry。

查看 Activity 类的源码可发现其继承树中继承了一个 ComponentActivity 类,该类实现了 LifeCycleOwner 接口:

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        HasDefaultViewModelProviderFactory,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
    
    

    ...

    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

    @NonNull
    @Override
    public Lifecycle getLifecycle() {
    
    
        return mLifecycleRegistry;
    }

    ...
}

查看 Activity 类继承树中的 FragmentActivity 的源码,可以看到 LifeCycleRegistry 在各个生命周期回调中进行了注册(篇幅限制,只展示其中两个回调):

public class FragmentActivity extends ComponentActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        ActivityCompat.RequestPermissionsRequestCodeValidator {
    
    

    ...

    final LifecycleRegistry mFragmentLifecycleRegistry = new LifecycleRegistry(this);

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    
    
        super.onCreate(savedInstanceState);
        ...
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

    protected void onDestroy() {
    
    
        super.onDestroy();
        ...
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    }

    ...
}

因此当我们需要监听 Activity 的生命周期时,我们只需要实现监听者部分的代码就可以。

LifeCycleObserver(监听者)

实现 LifeCycleObserver 接口的是需要感知生命周期的类、组件等。 LifeCycleObserver 接口的源代码如下:

@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {
    
    

}

因此我们在实现此接口的时候不需要实现特定方法,而是通过注解来实现对生命周期的监听,具体的实现方式如下:

public class MyLifeCycleObserver implements LifecycleObserver {
    
    
    private static final String TAG = "MyLifeCycleObserver";
    public MyLifeCycleObserver(){
    
    };

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void activityCreate(){
    
    
        Log.d(TAG, "activityCreate");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void activityDestroy(){
    
    
        Log.d(TAG, "activityDestroy");
    }
}

观察者与监听者绑定

在需要监听的页面实现绑定,例如实现上述 MyLifeCycleObserver 与 MainActivity 的绑定,只需要在 MainActivity 的 onCreate() 方法中添加以下代码即可:

getLifecycle().addObserver(new MyLifeCycleObserver());

猜你喜欢

转载自blog.csdn.net/qingyunhuohuo1/article/details/110223078