Android jetpack架构组件Lifecycle实战与源码解析

Posted bug樱樱

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android jetpack架构组件Lifecycle实战与源码解析相关的知识,希望对你有一定的参考价值。

Lifecycle简介

什么是Lifecycle组件呢?总的来说,Lifecycle 就是具有生命周期感知能力的组件。简单的理解就是,当Activity/Fragment的生命周期产生变化时,Lifecycle组件会感应相应的生命周期变化,当然我们还可以通过使用Lifecycle组件来在自定义的类中管Activity/fragment的生命周期。
目前,Lifecycle生命周期组件主要由Lifecycle、LifecycleOwner、LifecycleObserver三个对象构成。

  • Lifecycle:是一个持有组件生命周期状态与事件(如Activity或Fragment)的信息的类。
  • LifecycleOwner:Lifecycle的提供者,通过实现LifecycleOwner接口来访问Lifecycle生命周期对象。
  • Fragment和FragmentActivity类实现了LifecycleOwner接口,它具有访问生命周期的getLifecycle方法,使用时需要在自己的类中实现LifecycleOwner。
  • LifecycleObserver:Lifecycle观察者,可以使用LifecycleOwner类的addObserver()方法进行注册,被注册后LifecycleObserver便可以观察到LifecycleOwner的生命周期事件。

这篇文章主要讲解LifeCycle在项目的简单用法。

AS中添加依赖

首先在工程根目录的build.gradle中添加一下内容:

allprojects 
    repositories 
        jcenter()
        maven  url 'https://maven.google.com'   //添加此行
    


然后在应用目录下的build.gradle中添加以下依赖:

//For Lifecycles, LiveData, and ViewModel
compile "android.arch.lifecycle:runtime:1.0.0-alpha1"
compile "android.arch.lifecycle:extensions:1.0.0-alpha1"
annotationProcessor "android.arch.lifecycle:compiler:1.0.0-alpha1"

//For Room
compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"

LifeCycle相关使用

在我们平时的项目中经常会遇到很多需要依赖生命周期的逻辑处理,比如有这么一个需求。
在某个Activity我们需要在屏幕上展现用户的地理位置。简单的实现方法如下:

class MyLocationListener 
    public MyLocationListener(Context context, Callback callback) 
        // ...
    

    void start() 
        // connect to system location service
    

    void stop() 
        // disconnect from system location service
    


class MyActivity extends AppCompatActivity 
    private MyLocationListener myLocationListener;

    public void onCreate(...) 
        myLocationListener = new MyLocationListener(this, (location) -> 
            // update UI
        );
  

    public void onStart() 
        super.onStart();
        myLocationListener.start();
    

    public void onStop() 
        super.onStop();
        myLocationListener.stop();
    


虽然以上代码看起来很简洁,但在实际项目中的onStart,onStop方法可能会变得相当庞大。
此外,实际情况可能并不像上面这么简单,例如我们需要在start位置监听前做用户状态检测,检测是一个耗时的任务,那么很有可能在检测结束前用户提前退出了Activity,这时候就会导致myLocationListener.start()myLocationListener.stop()后面调用,从而引起很多难以定位的问题。代码如下:

class MyActivity extends AppCompatActivity 
    private MyLocationListener myLocationListener;

    public void onCreate(...) 
        myLocationListener = new MyLocationListener(this, location -> 
            // update UI
        );
    

    public void onStart() 
        super.onStart();
        Util.checkUserStatus(result -> 
            // what if this callback is invoked AFTER activity is stopped?
            if (result) 
                myLocationListener.start();
            
        );
    

    public void onStop() 
        super.onStop();
        myLocationListener.stop();
    


这时候就该今天的主角LifeCycle出场了。它提供了一套接口帮助你处理这些问题。

LifeCycle

LifeCyle类持有Activity或者Fragment的生命周期相关信息,并且支持其他对象监听这些状态。

LifeCyle有两个枚举用于追踪生命周期中的状态。

Event

这是生命周期的事件类,会在Framework和LifeCycle间传递,这些事件映射到Activity和Fragment的回调事件中。

State

LifeCycle所持有Activity或Fragment的当前状态。

一个类想要监听LifeCycle的状态,只需要给其方法加上注解:

public class MyObserver implements LifecycleObserver 
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() 
    

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() 
    

aLifecycleOwner.getLifecycle().addObserver(new MyObserver());

LifeCycleOwner

LifeCycleOwner是一个只有一个方法的接口用于表明其有一个LifeCycle对象。这个方法为getLifecycle()
这个对象给Acitivity,Fragment和LifeCycle提供了一个很好的抽象关系,Activity和Fragment只要实现这个接口就能配合LifeCycle实现生命周期监听。

注意:由于目前LifeCycle处于alpha阶段,所以Fragment和AppCompatActivity并不会实现这些方法,在此之前,可以使用LifecycleActivityLifecycleFragment。等LifeCycle趋于稳定后,Fragment和AppCompatActivity会默认实现这些。

对于之前的位置监听的例子,我们可以让MyLocationListener继承LifecycleObserver,在onCreate中使用LifeCycle进行初始化,剩下的问题则不必担心了。因为MyLocationListener有能力进行生命周期的判断。

class MyActivity extends LifecycleActivity 
    private MyLocationListener myLocationListener;

    public void onCreate(...) 
        //此处进行初始化getLifecycle()传入LifeCycle对象
        myLocationListener = new MyLocationListener(this, getLifecycle(), location -> 
            // update UI
        );
        //检测用户状态并启用监听
        Util.checkUserStatus(result -> 
            if (result) 
                myLocationListener.enable();
            
        );
  



下面看一下MyLocationListener

class MyLocationListener implements LifecycleObserver 
    private boolean enabled = false;
    public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) 
       ...
    

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    void start() 
        if (enabled) 
           // connect
        
    

    public void enable() 
        enabled = true;
        //⓵
        if (lifecycle.getState().isAtLeast(STARTED)) 
            // connect if not connected
        
    

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    void stop() 
        // disconnect if connected
    


LifeCycle最重要的特性就是在⓵处,他可以提供主动查询生命周期状态的方法。这样就避免了上面遇到的myLocationListener.start()myLocationListener.stop()后面调用的问题。

通过以上的实现,我们的LocationListener是完全的生命周期感知了,它可以进行自己的初始化和资源清理而不必受Activity或者Fragment的管理。这时候如果我们在其他Activity或者Fragment中使用LocationListener,我们只需要初始化它就行了,不必再担心生命周期对它的影响,因为它内部会做好这一切。

通过LefeCycle工作的类我们称之为生命周期感知。鼓励需要使用Android生命周期的类的库提供生命周期感知组件,以便客户端可以轻松地在客户端上集成这些类,而无需手动生命周期管理。

LiveData就是生命周期感知组件的示例,将LiveData和ViewModel一起使用,可以在遵循Android生命周期的情况下,更容易的使用数据来填充UI。

新的开始

改变人生,没有什么捷径可言,这条路需要自己亲自去走一走,只有深入思考,不断反思总结,保持学习的热情,一步一步构建自己完整的知识体系,才是最终的制胜之道,也是程序员应该承担的使命。

如果有需要进阶Android高级工程师系统学习资料的,我可以免费分享给大家,需要完整版的朋友,【扫描二维码】

《系列学习视频》

《系列学习文档》

《我的大厂面试之旅》

以上是关于Android jetpack架构组件Lifecycle实战与源码解析的主要内容,如果未能解决你的问题,请参考以下文章

Android Jetpack架构组件——什么是Jetpack?

Android Jetpack架构组件——什么是Jetpack?

Android高级Jetpack架构组件+Jetpack compose强化实战

Android Jetpack架构组件带你了解Android Jetpack

Android Jetpack架构组件(入门教程及进阶实战)独家首发

Android Jetpack中DataBinding将布局视图绑定到架构组件